实战MEF(4):搜索范围
在前面的文章中,几乎每个示例我们都会接触到扩展类的搜索位置,我们也不妨想一下,既然是自动扩展,它肯定会有一个或者多人可供查找的位置,不然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用在哪些地方,只要记住两个原则:
- 在需要某项技术时就该当机立断,否则反受其乱。
- 技术运用讲求灵活,无招胜有招,就像李小龙的"李三脚"一样,切忌滥用。
好了,说了这么多,我也口渴了,先喝杯橙汗解解渴,再见。
实战MEF(4):搜索范围相关推荐
- .net 插件式开发学习总结
.NET简谈插件系统开发模式 今天跟大家分享一下我们在日常开发中并不常用的开发模式"插件系统模式",什么叫插件从大一点的概念讲就是我们开发的软件是由很小的模块组成,每一块都能成功的 ...
- oracle 跨分区查询效率,Oracle分区表做跨分区查询
问:有一张大表,其中按时间字段(TIME_ID)进行表分区(按季度分区),但是如果业务人员做跨季度的大批量数据的查询时,未能走TIME_ID分区索引,导致全表扫描.此种情况该如何处理? 示例解析: 1 ...
- c# MEF框架(四 见证奇迹的时刻之实战应用)
转自 http://www.cnblogs.com/yunfeifei/p/3940075.html 前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前 ...
- 原理+代码实战 | 双目视觉中的极线校正
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:计算机视觉life 为什么要做极线校正? 三维重建是通过 ...
- JVM实战与原理---类加载机制
JVM实战与原理 目录 类加载机制 1. 类加载生命周期 1.1 加载 1.2 验证 1.3 准备 1.4 解析 1.5 初始化 2. 类加载器 类加载机制 章节目的:了解虚拟机如何加载Class文件 ...
- C# 值得永久收藏的WPF项目实战(经典)
01 - 简介 之前也写过好多篇CM框架相关的项目实战文章,比如: C# WPF框架Caliburn.Micro快速搭建 C# WPF框架Caliburn.Micro入门实例1 C# WPF MVVM ...
- visualvm远程监控jvm_大型企业JVM实战:优化及面试热点分析
本次课程的笔记非常多,而且内容已经整理了好几个小时了,接着下来内容也会更多,也是大型企业JVM性能调优实战的最后一节,希望对你有帮助! 04:JVM性能监控与故障处理工具 大型企业JVM性能调优实战之 ...
- 【Python实战】批量爬取微博素材,一分钟百张大图自动下载
目录 前言 一.思考逻辑 二.观察URL 三.微博爬虫 四.下载保存 结尾 前言 大家好,我是Samaritan. 这期本来想做个咸鱼 写个学习笔记发的,然后没做成咸鱼 临时变卦,再写一期实战. 事情 ...
- 渗透测试实战指南笔记
第二章 2.1 在Linux系统中安装LANMP LANMP是Linux下Apache.Nginx.MySQL和PHP的应用环境,本节演示的是WDLinux的一款集成的安装包. 首先,下载需要的安装包 ...
最新文章
- R语言可视化包ggplot2包通过因子变量设置图像颜色实战
- Redis 启动与授权
- [转] 数学符号英文拼写及发音
- HighNewTech:动图看1997~2019年《世界最有价值公司Top10排名》的变迁史——《Most Valuable Companies In The World》
- 2021暑假实习-SSM超市积分管理系统-day03笔记
- VTK:可视化之TransformActorCollection
- 英语影视台词---八、the shawshank redemption
- 一些关于毫米波技术的文献
- 关闭word_Word文档如何快速查找?超实用的5个Word技巧教给你
- 请问delphix下双缓冲是自动开启的吗?
- 计算机注销之后一直黑屏,win7系统注销出现黑屏怎么办_win7系统注销出现黑屏的修复办法...
- 国科大模式识别与机器学习课程整理
- 计算机中组策略编辑,组策略编辑器用法-如何使用组策略
- Matlab提示Ill-conditioned covariance created at iteration
- BottomNavigationView修改图标/文字大小,替换图标
- 学习漫画应该如何入门?其实掌握这5种漫画套路就可以啦
- 如果睡眠不足,我们的大脑会怎么样?
- excel制作跨职能流程图_excel制作流程图的方法步骤图
- transitive dependencies (if any) will not be available, enable debug logging for more details
- Linux内核分析 期中总结
热门文章
- 团队项目冲刺第二天进度
- JAVA 1.7并发之LinkedTransferQueue原理理解
- Fibonacci算法
- strcpy的用法、c语言实现、及注意点
- php网页示例,新手入门:初学动态网页PHP的18个例子
- python写日志到文件_python 通过logging写入日志到文件和控制台的实例
- wpf messagebox.show()点击其他地方会闪烁_定时、童锁、故障查询,线控器上的这些功能你会用吗?...
- isupper_Python字符串isupper()
- jsp错误处理页面_JSP异常处理– JSP错误页面
- Java中的原型设计模式