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

Mono addin 学习笔记 4 再论数据扩展点(Data only extension point)的更多相关文章

  1. Mono addin 学习笔记 3

    典型的基于Mono addin插件框架的应用程序有以下一个部分组成: 1. 主应用程序:提供了一系列的扩展点(Extension Point)供其他应用进行扩展: 2. 扩展插件: 其部署结构图如下为 ...

  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. R学习笔记(4): 使用外部数据

    来源于:R学习笔记(4): 使用外部数据 博客:心内求法 鉴于内存的非持久性和容量限制,一个有效的数据处理工具必须能够使用外部数据:能够从外部获取大量的数据,也能够将处理结果保存.R中提供了一系列的函 ...

  6. Kotlin学习笔记(9)- 数据类

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...

  7. .NET MVC 学习笔记(六)— 数据导入

    .NET MVC 学习笔记(六)—— 数据导入 在程序使用过程中,有时候需要新增大量数据,这样一条条数据去Add明显不是很友好,这时候最好就是有一个导入功能,导入所需要的数据,下面我们就一起来看一下导 ...

  8. openresty 学习笔记二:获取请求数据

    openresty 学习笔记二:获取请求数据 openresty 获取POST或者GET的请求参数.这个是要用openresty 做接口必须要做的事情.这里分几种类型:GET,POST(urlenco ...

  9. python3.4学习笔记(三) idle 清屏扩展插件

    python3.4学习笔记(三) idle 清屏扩展插件python idle 清屏问题的解决,使用python idle都会遇到一个常见而又懊恼的问题——要怎么清屏?在stackoverflow看到 ...

随机推荐

  1. (转)javascript匿名函数的写法、传参和递归

    (原)http://www.veryhuo.com/a/view/37529.html (转)javascript匿名函数的写法.传参和递归 http://www.veryhuo.com 2011-0 ...

  2. UE4 在C++ 动态生成几何、BSP体、Brush ---- Mesh_Generation

    截至UE4  4.10 runtime 无法生成BSP类 ,只能通过自定义的Mesh的Vertex 进行绘制 ( Google 考证,能改UE4源码的请忽略 ) 可用到的 UE4 集成的Render ...

  3. 三部曲一(数据结构)-1020-Ultra-QuickSort

    通过这道题我大体理解了树状数组的原理和用法,完全用的别人的算法,我把别人算法看懂之后有自己敲了一遍,不得不说这算法真是高深巧妙啊,我开始看都看不懂,还是在别人的讲解下才看懂的,我觉得有必要写个博客记录 ...

  4. OD调试2

    通过视频学习,实现了一下简单的traceme爆破.这不是把它的序列号破译出来,只是识别了自己的号码,不算真正的爆破.(与期望有点差异) 先来看一下这款软件的逻辑结构. 先输入用户名  以及序列号 然后 ...

  5. 简便删除已经存在的oracle数据库用户UPAY3LINGXI_YS

    简便删除已经存在的oracle数据库用户UPAY3LINGXI_YS:1.Toad工具用oracle最大权限用户登录system2.查看正在使用UPAY3LINGXI_YS的进程select * fr ...

  6. Smart210学习记录-----Linux i2c驱动

    一:Linux i2c子系统简介: 1.Linux 的 I2C 体系结构分为 3 个组成部分: (1) I2C 核心. I2C 核心提供了 I2C 总线驱动和设备驱动的注册.注销方法,I2C 通信方法 ...

  7. webpack脚手架搭建(简单版)

    运行命令 安装依赖:npm install 运行项目:npm start 大致流程 npm init:新建 package.json 将需要的依赖模块加入 dependencies(生产环境) 和 d ...

  8. 巧用TexturePacker命令行

    游戏开发使用TexturePacker来生成图片的atlas sheet, 工具非常好用. 一般GUI的方法, 新建一个tps文件, 将要图片加载进来,调整参数和输出路径, 最后点publish. 在 ...

  9. Python KNN算法

    机器学习新手,接触的是<机器学习实战>这本书,感觉书中描述简单易懂,但对于python语言不熟悉的我,也有很大的空间.今天学习的是k-近邻算法. 1. 简述机器学习 在日常生活中,人们很难 ...

  10. codeforces195a

    link:http://codeforces.com/problemset/problem/336/A 很简单的一道题目,当初有个单词不认识,isosceles原来意思是等腰的o(╯□╰)o #inc ...