zoukankan      html  css  js  c++  java
  • Mono addin 学习笔记 4 再论数据扩展点(Data only extension point)

    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方式来进行定义,部署方式很灵活。

  • 相关阅读:
    浅谈样式表QSS的应用
    从一个笑话看软件开发管理(转帖)
    项目的大小衡量标准,项目架构的方法(填空架子,持续集成,边开发边测试效果)(装贴)
    做项目过程一点心得
    什么时候该写函数,什么时候该写类。
    QWidget属性,函数的学习
    Qt 中一些常用类中文说明
    swing应用中如何保存一个全局变量
    Implicit Linking与Explicit Linking
    qt中设置菜单高度
  • 原文地址:https://www.cnblogs.com/lenmom/p/3598849.html
Copyright © 2011-2022 走看看