首页 > 其他 > 详细

mono addin 学习笔记 3

时间:2014-03-12 05:16:26      阅读:427      评论:0      收藏:0      [点我收藏+]

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

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

2. 扩展插件;

其部署结构图如下为

bubuko.com,布布扣

 

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

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);
            }

 

输出为:

bubuko.com,布布扣

其中的 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>

mono addin 学习笔记 3,布布扣,bubuko.com

mono addin 学习笔记 3

原文:http://www.cnblogs.com/lenmom/p/3594270.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!