典型的基于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,无法将数据内置进去;

如图:

Mono addin 学习笔记 3的更多相关文章

  1. Mono addin 学习笔记 4 再论数据扩展点(Data only extension point)

    1. Attribute声明方式 定义扩展属性 [AttributeUsage(AttributeTargets.Assembly, AllowMultiple= true)] public clas ...

  2. Mono addin 学习笔记 1

    Mono Addin是一个开源的插件框架,其主要支持的特性如下: The main features of Mono.Addins are: Supports descriptions of add- ...

  3. Mono addin 学习笔记 2

    下面分析用xml描述文件的方式来进行插件定义 定义扩展点如下: public interface ISnippetProvider { string GetText (string shortcut) ...

  4. Mono addin 学习笔记 5 TypeExtensionPoint

    1. Attribute声明方式 定义扩展点: [TypeExtensionPoint]public interface ICommand{        void Run();} 定义扩展: [Ex ...

  5. NGUI 学习笔记实战之二——商城数据绑定(Ndata)

    上次笔记实现了游戏商城的UI界面,没有实现动态数据绑定,所以是远远不够的.今天采用NData来做一个商城. 如果你之前没看过,可以参考上一篇博客   NGUI 学习笔记实战——制作商城UI界面  ht ...

  6. MVC_学习笔记_2_Authorize

    MVC5_学习笔记_2_Authorize/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Author: Nico ...

  7. C#.NET学习笔记1---C#.NET简介

    C#.NET学习笔记1---C#.NET简介 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com -------------- ...

  8. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

  9. VSTO 学习笔记(十二)自定义公式与Ribbon

    原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...

随机推荐

  1. 关于 php mysql pdo cannot find driver 解决方案

    1.下载 文件 或者 进入 在PHP源码包中进入ext/pdo_mysql http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz 2.解压文件tar zxvf PDO ...

  2. DownloadManager补漏

    原始完成于:2014-10-24 20:01:03 DownloadManager是一个处理HTTP下载请求的系统服务: 1. 基本用法 1 private void download() { 2 R ...

  3. DeepLearning之路(一)逻辑回归

    逻辑回归 1.  总述 逻辑回归来源于回归分析,用来解决分类问题,即预测值变为较少数量的离散值. 2.  基本概念 回归分析(Regression Analysis):存在一堆观测资料,希望获得数据内 ...

  4. K2 BPM打造企业新门户,步入移动办公时代

    公司介绍步步高教育电子有限公司(前身为步步高电脑电玩厂)是广东步步高电子工业有限公司属下的三个分公司之一,一直致力于面向广大学生的教育电子产品的研发与生产,主要产品有视频学习机.点读机.学生电脑.语言 ...

  5. C++不用任何算术运算符实现整数加法

    这本是careerup的一道题,看到了以后自己做了一下,主要的难点就是加法里面的进位.直接上代码: int add(int a, int b) { ; }; int first = a, second ...

  6. web前端基础篇⑥

    LESS.①是一种拓展技术,基于css.②包含变量.混合.函数.运算.③简化css代码.降低维护成本④目前用的解析器(koala) 变量(值可变)@变量名:值步骤:①建立文件夹②建html和less两 ...

  7. java 自带md5加密

    package test; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub ...

  8. 隐藏ArcGIS server设置的用户名

    打开注册表编辑器,定位到“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\ SpecialAccoun ...

  9. VS 2010 编译 Openssl

    VS 2010 编译 Openssl 1. 编译环境: Visual Studio 2010 Windows 7 64 旗舰版 openssl-1.0.1s 2. 下载安装ActivePerl,下载下 ...

  10. tf.slice可以用于矩阵也就是图片的切割

    第一个向量表示切割的起点,第二个向量表示矩形框的大小,-1表示取该元素的最大值