• Mono addin 学习笔记 3


    典型的基于Mono addin插件框架的应用程序有以下一个部分组成:

    1. 主应用程序:提供了一系列的扩展点(Extension Point)供其他应用进行扩展;

    2. 扩展插件;

    其部署结构图如下为

    本篇将详细讲述扩展点的几种方式:

    1. TypeExtensionPoint(类型扩展点);

    2. Data Extension Point(数据扩展点);

    1. TypeExtensionPoint类型扩展点

    典型的类型扩展点如下:

    [TypeExtensionPoint]

    public interface ICommand

    {

            void Run ();

    }


    TypeExtensionPoint属性应用于类扩接口上时,则定义了一个接受该类型的扩展点 。在上述代码中,我们定义了一个实现ICommand接口类型的扩展点;

    实现该扩展点的扩展定义示例如下:

    [Extension]

    public class HelloCommand: ICommand

    {

            public void Run ()

            {

                   Console.WriteLine ("Hello World!");

            }

    }

    [Extension] 属性应用与该类上,表明我们创建了一个该类型基类型的扩展点,扩展点的类型一般是该实现类的基类型或基类,如果一个类实现了多个接口,则需要在属性上明确指明实现的是基于哪个类型的扩展,如:[Extension (typeof(ICommand))].

     

    对于TypeExtensionPoint类型的扩展点,我们可以使用如下方式来进行查询

     AddinManager.GetExtensionObjects<ICommand>()

    使用示例如下:

    foreach (ICommand cmd in AddinManager.GetExtensionObjects(typeof(ICommand)))
          cmd.Run();

     

    实例管理:

    AddinManager.GetExtensionObjects()方法有一个参数reuseCachedInstance,如果设置为true,将会复用之前创建的对象,如果为false,将每次创建新的对象,默认设置为true.

     

    懒加载:

    foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes(typeof(ICommand)))
    {
         ICommand command = node.CreateInstance() as ICommand;
         command.Run();
    }

     

    对于TypeExtensionPoint类型的扩展点我们可以使用上述方式来查询到扩展点,并在需要的时候进行实例化,实现懒加载

     

    2. Data Extension Point(数据扩展点)

    扩展点有时候不完全是类型扩展点,我们也可以定义数据类型扩展点,如定义一种执行策略,定义一种新的文档模板等,mono addin框架对数据类型的扩展点提供了很好的支持,如我们定义如下的扩展点,

    定义扩展点:

    [assembly:ExtensionPoint ("/HelloWorld/WelcomeMessages", ExtensionAttributeType=typeof(WelcomeMessageAttribute))]

     

    定义扩展属性:

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

    public class WelcomeMessageAttribute: CustomExtensionAttribute

    {

            public WelcomeMessageAttribute ([NodeAttribute ("Text")] string text)

            {

                   Text = text;

            }

     

            [NodeAttribute]

            public string Text { get; set; }

    }

     

    扩展实现:

    [assembly: WelcomeMessages("Another Message")]
    [assembly:WelcomeMessages("One Message")]

     

    使用方式代码示例:

    通过AddinManager.GetExtensionNodes(string path)来查询扩展节点的集合,类型为ExtensionNode<T>,其中T为上面定义的扩展属性,代码如下,

            foreach (ExtensionNode<WelcomeMessagesAttribute> node in AddinManager.GetExtensionNodes("/HelloWorld/WelcomeMessages"))
                {
                    Console.WriteLine("Message: " + node.Data.Path + " " + node.Data.Id + " " + node.Data.Message);
                }

     

    输出为:

    其中的 message为我们在扩展实现中定义的扩展。

     

    xml配置方式为:

    <addin id="HelloWorld" version="1.0" >

         <ExtensionPoint path="/HelloWorld/WelcomeMessages"  name="WelcomeMessages">    

                 <ExtensionNode name="Command"/>  

           </ExtensionPoint>    

           <Extension path = "/HelloWorld/WelcomeMessages">    

                  <Command  type="HelloWorld.WelcomeMessagesAttribute" Message="One message"  />    

                  <Command  type="HelloWorld.WelcomeMessagesAttribute"  Message="Another message"/>

           </Extension>  

    </addin>

    注:Attributes方式声明和基于xml格式的声明可以同时使用,但是行为会有少许的不同,主要体现在:

    1. Attributes声明方式定义的扩展,查询后返回的是ExtensionNode<WelcomeMessagesAttribute>格式的节点;通过节点的Data属性可以访问设置的数据值;

    2. 通过xml定义的声明返回的是TypeExtensionNode,无法将数据内置进去;

    如图:

  • 相关阅读:
    [LeetCode] Word Ladder II
    [LeetCode] Edit Distance
    [LeetCode] Merge Intervals
    内存分配与Segmentation fault
    结构体 指针 数组
    resolv.conf
    无法启动xwindow
    stopping NetworkManager daemon failed
    linux 挂载光盘:mount: you must specify the filesystem type
    修改主机hostname
  • 原文地址:https://www.cnblogs.com/lenmom/p/3594270.html
Copyright © 2020-2023  润新知