MEF入门之不求甚解,但力求简单能讲明白(四)
上一篇我们已经可以获取各种FileHandler的实例和对应的元数据。本篇,我们做一个稍微完整的文件管理器。
1、修改接口IFileHandler,传入文件名
namespace IPart {public interface IFileHandler{void Process(string fileName);} }
2、修改具体的FileHandler。
using IPart; using System; using System.ComponentModel.Composition;namespace Parts {[Export(typeof(IFileHandler))]//表示此类需要导出,导出的类型为IFileHandler[ExportMetadata("Extension", ".txt")]//添加导出元数据Extension,值为.txtpublic class TxtFileHandler : IFileHandler{public void Process(string fileName){Console.WriteLine("处理文本文件"+fileName);}} }
3、修改主函数
using IPart; using System; using System.ComponentModel.Composition.Hosting; using System.Linq;namespace meftest {class Program{//容器,装东西用的。具体装什么先不管。private static CompositionContainer container;static void Main(string[] args){//模拟数据。string[] files = new string[] {@"c:\xxoo\xxoo.txt",@"c:\xxoo\ooxx.doc",@"d:\测试目录\mm.jpg",@"e:\电影\天海翼.avi",};//AssemblyCatalog 目录的一种,表示在程序集中搜索var assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);//此处这一句实际上没啥用,因为此程序集下没有任何我们需要的实例(各种handler)//在某个目录下的dll中搜索。var directoryCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"*.dll");var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog);//创建搜索到的部件,放到容器中。container = new CompositionContainer(aggregateCatalog); var exports = container.GetExports<IFileHandler,IPatMetadata>();//获得所有导出的部件(IFileHandler,并且带有IPatMetadata类型元数据,并且元数据的名字为Extension的实例)。foreach (var file in files){string ext = System.IO.Path.GetExtension(file).ToLower();var export = exports.SingleOrDefault(o => o.Metadata.Extension == ext);//根据扩展名,也就是元数据来找到对应的处理实例,如果你找到了多个,会thow一个错误。if (export != null)export.Value.Process(file);}Console.ReadLine();}} }
运行结果:
可以看到,对每一个具体的文件,均找到了正确的处理实例进行处理。avi文件,没有找到处理的实例,就没处理。
扩展:
现在要能处理avi,非常的简单,随便拷贝一个Handler,实现Avi文件的处理逻辑即可,当然你仍然需要拷贝dll。
using IPart; using System; using System.ComponentModel.Composition;namespace Parts {[Export(typeof(IFileHandler))]//表示此类需要导出,导出的类型为IFileHandler[ExportMetadata("Extension", ".avi")]//添加导出元数据Extension,值为.txtpublic class AviFileHandler : IFileHandler{public void Process(string fileName){Console.WriteLine("播放av文件"+fileName);}} }
你看,扩展是不是很简单,只需要实现处理逻辑,主程序就可以多处理一种文件类型了。接口和主程序根本就不需要做改动。
和其他IOC框架相比,MEF不需要配置文件,用attribute的方式来做配置,非常的清楚简洁。
总结:
你用了十分钟就能看完这个系列,把所有项目都建一遍跑完,也就花个把小时。现在,你得到了一个新技能MEF,而且达到了我的水平,哈哈。
本人很菜,学MEF,园子里的文章好像对我来说有点难,走了一些弯路,最终才搞明白一些。因此想写一个能讲简单清楚一点的入门教程,也不知道目标达到了没有。
告诉我,MEF,你入门了没有。
最恨天下文章一大抄,请不要转载。
转载于:https://www.cnblogs.com/luhuanong/p/5541264.html
MEF入门之不求甚解,但力求简单能讲明白(四)相关推荐
- MEF入门之不求甚解,但力求简单能讲明白(五)
我们已经成功的达到了目标,大量减少了if else. 不过在园子里面的文章大多,用的是Import.ImportMany.So,修改主函数. using IPart; using System; us ...
- C# MEF入门讲解
MEF入门之不求甚解,但力求简单能讲明白(一) 起因:工作需要针对不同类型的文件做不同的处理.打个比方,txt文件,直接打印,doc文件,直接发email,jpg文件,上传xxx相册站点. 其实这个问 ...
- WF4.0入门系列1——创建一个简单的工作流
WF4.0入门系列1--创建一个简单的工作流 打开VS2010,选择文件-新建-项目,选择Workflow项 工作流台应用程序,在名称处输入chapter01,选择合适的位置,这里默认,单击确定. V ...
- C语言中怎么用循环统计买法,C语言入门谭浩强版简单选择法冒泡法用数组和for循环进行学生成绩简单统计处理...
C语言入门谭浩强版 简单选择法排序 冒泡法排序 用数组和for循环进行学生成绩简单统计处理 例如:求个人平均分 学科平均分 单科最高分等 简单选择法 #include #define N 10 voi ...
- 【Yocto学习入门】02 - 构建一个简单的Poky参考嵌入式操作系统
[Yocto学习入门]02 - 构建一个简单的Poky参考嵌入式操作系统 一.开发环境准备 二.下载 Poky 代码 三.配置编译环境 3.1 下载失败情况处理 Failed to fetch URL ...
- 【深度学习入门基础】二、简单理解 Transformer
[深度学习入门基础]二.简单理解 Transformer 文章目录 [深度学习入门基础]二.简单理解 Transformer 自注意力层 多头注意力 Transformer 输入(输出)嵌入 位置编码 ...
- 【前端实例代码】Html5+css3创建拟物风格昏昏欲睡的云朵动画网页效果~前端开发网页设计基础入门教程~适合初学者~超简单~
b站视频演示效果: [前端实例代码]Html5+css3创建拟物风格昏昏欲睡的云朵动画网页效果!前端开发网页设计基础入门教程!适合初学者~超简单~ 效果图: 完整代码: <!DOCTYPE ht ...
- 编程语言用Python实现九九乘法表的几种方式,入门必备案例!超级简单!
编程语言用Python实现九九乘法表的几种方式,入门必备案例!超级简单! 我们在学习Python的过程中需要不断的积累和练习,这样才能够走的更远,今天一起来学习怎么用Python写九九乘法表~ 第一种 ...
- java etl工具_一文带你入门ETL工具-datax的简单使用
什么是ETL? ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为联机分析处理.数据挖掘的基础. ETL是数据 ...
最新文章
- python random库生成伯努利随机数的方法_Python使用random模块生成随机数操作实例详解...
- Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)
- PHP垃圾回收机制防止内存溢出
- SpendidCRM:在admin-layout中修改了视图上的字段后,用MyGeneration生成修改脚本
- 看bilibili的财经博主,分析博主的频道
- 1332: 生日日数
- 解决“跨域问题”的几种方法
- 张善友: .NET社区运营 | 2021 中国开发者生态峰会
- 如何用texstudio下载ctex_公众号素材库视频如何下载,用这种方法就可以哦
- 5 LInux系统目录结构
- (61)UART外设驱动接收驱动(六)(第13天)
- (88)Verilog HDL系统函数和任务:$fdisplay
- docker -v 挂载文件_浅谈关于docker中数据卷的操作,附带案例
- HDU 1251 - 统计难题(字典树模板题)
- mysql sjis 校对乱码_mysql 解决中文乱码问题
- HttpPrinter共享打印机 网络打印
- 『开源项目』基于STM32的智能垃圾桶之语音播报
- 基于Android的蜗要工作app的设计与实现
- unity中移动部件靠近时触发动画,模型替换特效演示
- “奇点”临近:2045,人类永生
热门文章
- 【java】窗口控件及字符串和异常的综合应用
- 【java】Applet显示阶乘结果
- php滑动轮播效果,js实现移动端手指滑动轮播图效果
- hashtable是线程安全的吗_Java程序猿必知:线程安全ConcurrentHashMap和Hashtable有啥区别...
- mac中sublime运行html,Mac系统下Sublime Text直接运行JavaScript调试控制台
- java如何新建一个空的压缩包_如何在Java中创建zip文件
- ggplot2如何实现1页多图
- ObjC学习8-重头戏来了!Foundation框架
- 【Android MyEclipse】no projects are found to import 如何解决
- Android Activity概述