lenmom

博客园 首页 新随笔 联系 订阅 管理

1. Attribute声明方式

定义扩展属性

 

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple= true)]    

public class WelcomeMessagesAttribute : CustomExtensionAttribute    

{        

         [NodeAttribute]        

         public string Message  { get;set;}

 

        /// <summary>        

        /// The default constructor is must for the arrtibute.        

        /// </summary>        

        public WelcomeMessagesAttribute()        

       {                 

 

        }

 

        public WelcomeMessagesAttribute([NodeAttribute("Message")] string message)        

       {            

               this.Message = message;   

       }  

 }

定义扩展点,

[assembly: ExtensionPoint("/DataExtensionPointMenifest/WelcomeMessages",   ExtensionAttributeType = typeof(WelcomeMessagesAttribute))]

定义数据扩展

[assembly: WelcomeMessagesAttribute("One message")]

[assembly: WelcomeMessagesAttribute("Another message")]

 

调用方式:

            foreach (ExtensionNode<WelcomeMessagesAttribute> node in AddinManager.GetExtensionNodes("/DataExtensionPointMenifest/WelcomeMessages"))
            {
                Console.WriteLine(node.Data.Message);
            }

 

输出为:

One message

Another message

2. xml配置方式

 

定义扩展节点

public class MessageExtensionNode : ExtensionNode    

{        

          [NodeAttribute]        

          public string Message { get; set; }

          public MessageExtensionNode()        

          {           

                 // Nothing to do.       

           }

 

          public MessageExtensionNode([NodeAttribute("Message")] string message)       

          {          

                  this.Message = message;  

          }   

}

 

扩展点声明xml配置方法为:

  <!--显示实现了扩展节点(ExtensionNode)的配置方法 设置对应节点的type属性-->
  <ExtensionPoint path="/menifestMessage"  name="WelcomeMessages" >
           <ExtensionNode name="MessageNode"
                   type="MessageExtensionNode"><!--定义扩展点类型,和具体的CLR类名相同-->
          </ExtensionNode>
  </ExtensionPoint>

 

实现上述扩展点的xml配置为:

  <Extension path = "/menifestMessage">
    <MessageNode   Message="MessageExtensionNode: One message"  />
    <MessageNode   Message="MessageExtensionNode: Two message"  />
  </Extension>

 

使用方法:

foreach (MessageExtensionNode node in AddinManager.GetExtensionNodes("/menifestMessage"))
{
      Console.WriteLine(node.Message);
}

 

输出为:

MessageExtensionNode: One message

MessageExtensionNode: Two message

 

 

 基于数据的扩展点,能够实现的功能包括:

1.  懒加载,Mono addin通过扫描扩展点数据,只在需要使用到具体的插件的时候才会去加载插件,可以动态创建具体的类型,在具体执行时才创建具体的类型;

2.  和App.config文件相比,数据扩展点可以将配置分布在不同的插件工程配置中,而不需要集中在主程序的config文件中。

3.  部署时可以通过单独的文件进行部署,也可以作为嵌入式资源文件保存到dll文件中。还可以通过代码Attribute方式来进行定义,部署方式很灵活。

 

posted on 2014-03-13 17:02  老董  阅读(459)  评论(1编辑  收藏  举报