免费大数据网站,如何申请域名做网站,服务之家做网站简单吗,广州建站在前面的文章中#xff0c;几乎每个示例我们都会接触到扩展类的搜索位置#xff0c;我们也不妨想一下#xff0c;既然是自动扩展#xff0c;它肯定会有一个或者多人可供查找的位置#xff0c;不然MEF框架怎么知道哪里有扩展组件呢#xff1f; 就像我们用导航系统去查找某…在前面的文章中几乎每个示例我们都会接触到扩展类的搜索位置我们也不妨想一下既然是自动扩展它肯定会有一个或者多人可供查找的位置不然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的构造函数这样就能实现查找范围的组合了。 好现在运行一下看看第四个扩展是不是自动被发现了? Good预期的效果达到了是不是很高兴呢喝杯咖啡得意一下吧。 不知道大家看了我这几篇有关MEF的吹牛散文之后会不会感叹MEF的神奇呢不管大家会把MEF用在哪些地方只要记住两个原则 在需要某项技术时就该当机立断否则反受其乱。技术运用讲求灵活无招胜有招就像李小龙的李三脚一样切忌滥用。好了说了这么多我也口渴了先喝杯橙汗解解渴再见。转载于:https://www.cnblogs.com/tcjiaan/p/3301444.html