MEF搜索范围
MEF对扩展组件的查找范围通常有三个:
- AssemblyCatalog:从某个程序集中查找。
- ApplicationCatalog:在应用程序所在的目录下查找。
- DirectoryCatalog:在某个目录下查找,如D:\\Libs。
如果你还嫌不够的话,可以用AggregateCatalog来设置多个查找范围。
下面我们来逐个尝试一下。
AssemblyCatalog
基于某个程序集的范围查找,最常干的是在当前程序集内查找,当然也可以在其他程序集中查找。只要能得到一个Assembly对象就可以在其中查找,大家都那么聪明,我相信大家能理解的。
下面是一个典型的做法,例子是在当前程序集中查找扩展部件的。
首先,我们定义一个用于规范扩展部件行为的接口。
然后,写两个类来实现上面的接口,并将它们导出。
在应用程序类中,用一个公共字段把它们全部导入。
最后,在Main中进行组装并测试调用。
最终,程序运行结果如下图所示。
二、DirectoryCatalog
这一个我们可能有些陌生,因为在前面文章的示例中,我们并没有使用过该类,但是,不要因为陌生而害怕,天有多高,你的胆子就应该有多大,陌生的东西很多时候是不复杂的,就好像我们与陌生人对话有时候反而比与熟人对话更自在。
DirectoryCatalog类可以指定一个目录,让MEF在这个目录下面寻找扩展组件,如果需要更细致的查找,可以在DirectoryCatalog类的构造函数中指定一个搜索字符串,这个字符串与我们平时搜索文件一样,例如"ext_*",这表明只要以ext_开头的类库文件都在查找范围内。
这一次,我们用一个WinForm应用程序来做例子,在窗体中我们拖放几个控件,详见下图。
控件布局随意,我一向主张个性化布局的,主要以下几个重要的控件得介绍一下:
名为txtDirec的TextBox用来显示选择的目录;名为cmbClass的ComboBox控件用来显示MEF发现的扩展类的列表,名为txtResult的TextBox显示扩展类的调用结果。
下面说一下本例的大概思路,我们先把扩展的类库全放到一个任意文件夹下,然后在应用程序窗口上选择该目录后,让MEF框架在该目录下发现所有扩展类型并显示在ComboBox中。接着我们从ComboBox中选择一个类来调用,并查看调用结果。
- 我们先建一个公共类库,这个类库在主应用程序和所有扩展类库都会引用,因为我们会在其中定义用于规范组件行为的"宪法"(接口)。该类库暂名为CommonLib,代码如下,很简单,不超过10行。
这个接口只有一个方法SaySomething,待会我们分别用几个类来实现它,每个类都独立写到一个类库中。
- 新项一个类库项目,名为ExtLibA,代码如下:
同样道理,再建两个类库项目,分别是ExtLibB和ExtLibC。
- 分别生成这三个dll,还要包含一个CommonLib.dll,因为三个扩展库都引用了它。然后把这几个dll分别放到一个文件夹中,大致如下图所示。
- 回到WinForm项目,在窗体类中声明一个字段,公有或私有都无所谓,用于导入类型。
- 处理按钮事件,浏览目录,并从指定目录中寻找扩展部件,并且显示在ComboBox中。
- 处理按钮事件,调用ComoBox中选定的扩展类型。
然后,我们可以看看下面的执行结果。
三、AggregateCatalog
有一天,我不小心把新的扩展类ExtLibD写到了WinForm项目中了,就像这样:
然后我想,如果能保留前面的三个扩展类的同时,也自动识别我写到WinForm项目中的扩展类,那该多好啊。不怕,.NET的强大只有你想不到,没有它做不到的。这时候我把目光投向AggregateCatalog类,利用它可以将多个搜索范围合并,我们刚才的三个扩展是通过在一个文件夹中搜索的,而第四个扩展是写到WinForm项目中的,还记得前文中我们说过AssemblyCatalog类,它可以在某个程序集中寻找扩展类,所以第四个扩展类我们可以在WinForm项目所在的程序集中查找。
也就是说,我们把AssemblyCatalog范围和DirectoryCatalog范围进行组合。所以,把前面button1_Click的代码改一下,变成以下这个样子:
用AggregateCatalog来把DirectoryCatalog和AssemblyCatalog合并起来,再传给CompositionContainer的构造函数,这样就能实现查找范围的组合了。
好,现在运行一下,看看第四个扩展是不是自动被发现了?
原文来自:http://blog.csdn.net/tcjiaan/article/details/11082699
MEF搜索范围的更多相关文章
- 实战MEF(4):搜索范围
在前面的文章中,几乎每个示例我们都会接触到扩展类的搜索位置,我们也不妨想一下,既然是自动扩展,它肯定会有一个或者多人可供查找的位置,不然MEF框架怎么知道哪里有扩展组件呢? 就像我们用导航系统去查找某 ...
- 【WPF】运用MEF实现窗口的动态扩展
若干年前,老周写了几篇有关MEF的烂文,简单地说,MEF是一种动态扩展技术,比如可以指定以某个程序集或某个目录为搜索范围,应用程序在运行时会自动搜索符合条件的类型,并自动完成导入,这样做的好处是,主程 ...
- MEF学习
一. 什么是MEF MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置. 扩 ...
- 如何用 MEF 扩展应用程序
最近在写一篇关于如何扩展 Visual Studio 编辑器的文章时,用到了 MEF,因此打算写一篇文章提一下这个技术点.本篇文章并不打算详细介绍 MEF,只是一个最简单的入门,相信您在阅读本篇文章后 ...
- [MEF插件式开发] 一个简单的例子
偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...
- .net自带的IOC容器MEF使用
IOC能做什么 IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序. 控制反转: 将控制权移交给第三方容器 new 操作 依赖注入: 在程序 ...
- NET 自带IOC容器MEF指初体验
转自:http://www.cnblogs.com/ulex/p/4186881.html IOC容器:工具较多,大体功能都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动 ...
- 实战MEF(3):只导出类的成员
通过前面两篇文章的介绍,相信各位会明白MEF中有不少实用价值.上一文中我们也讨论了导入与导出,对于导出导入,今天我们再深入一点点,嗯,只是深入一点点而已,不会很难的,请大家务必放心,如果大家觉得看文章 ...
- 实战MEF(2):导出&导入
上一文中,我们大致明白了,利用MEF框架实现自动扫描并组装扩展组件的思路.本文我们继续前进,从最初的定义公共接口开始,一步步学会如何使用MEF. 在上一文中我们知道,对于每一个实现了公共规范的扩展组件 ...
随机推荐
- ubuntu16.04安装重启后显示黑屏
环境 华硕笔记本 ubuntu16.04系统 Nvidia GTX970显卡 问题 装好ubuntu后提示重启,重启后直接黑屏 方法 开机grub界面按e键,linux打头的行,quiet后添加nom ...
- 【poj3461】 Oulipo
http://poj.org/problem?id=3461 (题目链接) 题意 求一个字符串在另一个字符串中出现的次数. Solution KMP裸题,太久没写过了,都忘记怎么求next数组了..水 ...
- 【poj1260】 Pearls
http://poj.org/problem?id=1260 (题目链接) 题意 购买珍珠,所有珍珠分成n个档次,第i个档次购买每个珍珠的价格为p[i],需要购买第i档次的珍珠a[i]个.若要购买第i ...
- NOI2016模拟赛Zbox loves stack
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- hdu 4609 FFT
题意:给出一堆数,问从这些数中取3个能组成三角形的概率? sol:其实就是问从这些数里取3个组成三角形有多少种取法 脑洞大开的解法:用FFT 设一开始的数是1 3 3 4 作一个向量x,其中x[i]= ...
- Scala特性: 隐式转换
1.隐式转换特征: 1)隐式参数的用法 · 获取可能的预期类型 · 获取预期类型,并且拥有预期类型的行为 · 对信息进行补充说明(一般用函数做隐式参数的比较多) 2)隐式类: 3)隐式method:
- AngularJs ngIf、ngSwitch、ngHide/ngShow
在组合这些ng指令写到一篇文章里的时候,基本是有规则的,本兽会将功能相似相近的一类整合到一篇文章,方便理解和记忆. 这篇的三个指令也都是对DOM元素的操作,页面上显示/隐藏的判断,添加/移除的判断. ...
- jQuery知识点总结(第一天)
整理笔记前的题外话: 我认为互联网的高速发展其中最为主要的一点就是——开源. 开源精神,使得无数的IT爱好者贡献所学,将自己的智慧结晶无偿奉献给大家.后辈的学习者在混沌的互联网世界里,追寻着前辈们留下 ...
- CSS--值和单位
等价颜色表 什么叫Web安全色 所谓的“web安全”颜色是指在256色计算机系统上总能避免抖动的颜色. Web安全颜色可以表示为RGB值为20%和51(相应的十六进制值为33)的倍数. 如果使用RGB ...
- 数组Arrays
1.toString 方法 Arrays的toString方法可以方便的输出一个数组的字符串形式,方便查看,它有九个重载的方法,包括八种基本类型数组和一个对象类型数组,这里列举两个: public s ...