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,无法将数据内置进去;
如图:
Mono addin 学习笔记 3的更多相关文章
- Mono addin 学习笔记 4 再论数据扩展点(Data only extension point)
1. Attribute声明方式 定义扩展属性 [AttributeUsage(AttributeTargets.Assembly, AllowMultiple= true)] public clas ...
- Mono addin 学习笔记 1
Mono Addin是一个开源的插件框架,其主要支持的特性如下: The main features of Mono.Addins are: Supports descriptions of add- ...
- Mono addin 学习笔记 2
下面分析用xml描述文件的方式来进行插件定义 定义扩展点如下: public interface ISnippetProvider { string GetText (string shortcut) ...
- Mono addin 学习笔记 5 TypeExtensionPoint
1. Attribute声明方式 定义扩展点: [TypeExtensionPoint]public interface ICommand{ void Run();} 定义扩展: [Ex ...
- NGUI 学习笔记实战之二——商城数据绑定(Ndata)
上次笔记实现了游戏商城的UI界面,没有实现动态数据绑定,所以是远远不够的.今天采用NData来做一个商城. 如果你之前没看过,可以参考上一篇博客 NGUI 学习笔记实战——制作商城UI界面 ht ...
- MVC_学习笔记_2_Authorize
MVC5_学习笔记_2_Authorize/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Author: Nico ...
- C#.NET学习笔记1---C#.NET简介
C#.NET学习笔记1---C#.NET简介 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com -------------- ...
- VSTO学习笔记(十四)Excel数据透视表与PowerPivot
原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...
- VSTO 学习笔记(十二)自定义公式与Ribbon
原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...
随机推荐
- ExtJs中gridpanel分组后组名排序
/** * 定义降序的groupingStore */ var DescGroupingStore = Ext.extend(Ext.data.GroupingStore, { groupDir : ...
- 高性能Mysql
高性能 高可用 易伸缩 安全 高并发 定义 吞吐量(单位时间内多少次查询) MTBF(平均失效时间) MTTR(平均恢复时间) 同时工作的线程数或连接数 系统 事务 表锁.行级 ...
- linux命令每日一练习-mkdir,rm
mkdir 创建一个文件夹 mkdir -p tian/hong 递归创建文件目录 mkdir tian hong 创建多个文件 mkdir -v tian 创建文件的时候显示信息 mkdir -m ...
- ASP.NET编程模型之ASP.NET页面生命周期图解
ASP.NET编程模型中ASP.NET页面生命周期是指什么呢?它包括什么呢?ASP.NET编程模型之ASP.NET页面生命周期具体的过程有哪些呢?下面就开始我们的讲解吧: ASP.NET 页运行时,此 ...
- C++学习笔记22:设备
设备类型 设备文件的性质 设备文件不是普通的磁盘文件 读写设备的数据需要与相应的设备驱动器通信 设备文件的类型 字符设备:读写串行数据字节流,如串口.终端等 块设备:随机读写固定尺寸数据块,如磁盘设备 ...
- SVG文档的注意事项
SVG 是 HTML5 关于描述矢量图的元素.可以写在 <html> </html> 中,也可以保存为一个单独的.svg文件. 单独作为一个svg文件的时候,有一点规则需要注意 ...
- python数据结构与算法——冒泡排序
用两种方式实现,非递归和递归 直接上代码: 先是失败的递归方式,涉及到对象引用的问题: # Bad 想一想为啥不行? def bubblesort_rec_bad(A): if len(A)==1: ...
- poj2369 Permutations ——置换群
link:http://poj.org/problem?id=2369 置换群,最简单的那种. 找所有数字循环节的最小公倍数. /* ID: zypz4571 LANG: C++ TASK: perm ...
- UVA 11235 频繁出现的数值 RMQ
题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- Qt学习1
Action 的用法 首先在头文件的 private 中加: 1 2 3 QMenu *fileMenu; QMenu *editMenu; QMenu *helpMenu; 1 2 3 4 5 6 ...