上一篇我们已经可以获取各种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入门之不求甚解,但力求简单能讲明白(四)相关推荐

  1. MEF入门之不求甚解,但力求简单能讲明白(五)

    我们已经成功的达到了目标,大量减少了if else. 不过在园子里面的文章大多,用的是Import.ImportMany.So,修改主函数. using IPart; using System; us ...

  2. C# MEF入门讲解

    MEF入门之不求甚解,但力求简单能讲明白(一) 起因:工作需要针对不同类型的文件做不同的处理.打个比方,txt文件,直接打印,doc文件,直接发email,jpg文件,上传xxx相册站点. 其实这个问 ...

  3. WF4.0入门系列1——创建一个简单的工作流

    WF4.0入门系列1--创建一个简单的工作流 打开VS2010,选择文件-新建-项目,选择Workflow项 工作流台应用程序,在名称处输入chapter01,选择合适的位置,这里默认,单击确定. V ...

  4. C语言中怎么用循环统计买法,C语言入门谭浩强版简单选择法冒泡法用数组和for循环进行学生成绩简单统计处理...

    C语言入门谭浩强版 简单选择法排序 冒泡法排序 用数组和for循环进行学生成绩简单统计处理 例如:求个人平均分 学科平均分 单科最高分等 简单选择法 #include #define N 10 voi ...

  5. 【Yocto学习入门】02 - 构建一个简单的Poky参考嵌入式操作系统

    [Yocto学习入门]02 - 构建一个简单的Poky参考嵌入式操作系统 一.开发环境准备 二.下载 Poky 代码 三.配置编译环境 3.1 下载失败情况处理 Failed to fetch URL ...

  6. 【深度学习入门基础】二、简单理解 Transformer

    [深度学习入门基础]二.简单理解 Transformer 文章目录 [深度学习入门基础]二.简单理解 Transformer 自注意力层 多头注意力 Transformer 输入(输出)嵌入 位置编码 ...

  7. 【前端实例代码】Html5+css3创建拟物风格昏昏欲睡的云朵动画网页效果~前端开发网页设计基础入门教程~适合初学者~超简单~

    b站视频演示效果: [前端实例代码]Html5+css3创建拟物风格昏昏欲睡的云朵动画网页效果!前端开发网页设计基础入门教程!适合初学者~超简单~ 效果图: 完整代码: <!DOCTYPE ht ...

  8. 编程语言用Python实现九九乘法表的几种方式,入门必备案例!超级简单!

    编程语言用Python实现九九乘法表的几种方式,入门必备案例!超级简单! 我们在学习Python的过程中需要不断的积累和练习,这样才能够走的更远,今天一起来学习怎么用Python写九九乘法表~ 第一种 ...

  9. java etl工具_一文带你入门ETL工具-datax的简单使用

    什么是ETL? ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为联机分析处理.数据挖掘的基础. ETL是数据 ...

最新文章

  1. python random库生成伯努利随机数的方法_Python使用random模块生成随机数操作实例详解...
  2. Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)
  3. PHP垃圾回收机制防止内存溢出
  4. SpendidCRM:在admin-layout中修改了视图上的字段后,用MyGeneration生成修改脚本
  5. 看bilibili的财经博主,分析博主的频道
  6. 1332: 生日日数
  7. 解决“跨域问题”的几种方法
  8. 张善友: .NET社区运营 | 2021 中国开发者生态峰会
  9. 如何用texstudio下载ctex_公众号素材库视频如何下载,用这种方法就可以哦
  10. 5 LInux系统目录结构
  11. (61)UART外设驱动接收驱动(六)(第13天)
  12. (88)Verilog HDL系统函数和任务:$fdisplay
  13. docker -v 挂载文件_浅谈关于docker中数据卷的操作,附带案例
  14. HDU 1251 - 统计难题(字典树模板题)
  15. mysql sjis 校对乱码_mysql 解决中文乱码问题
  16. HttpPrinter共享打印机 网络打印
  17. 『开源项目』基于STM32的智能垃圾桶之语音播报
  18. 基于Android的蜗要工作app的设计与实现
  19. unity中移动部件靠近时触发动画,模型替换特效演示
  20. “奇点”临近:2045,人类永生

热门文章

  1. 【java】窗口控件及字符串和异常的综合应用
  2. 【java】Applet显示阶乘结果
  3. php滑动轮播效果,js实现移动端手指滑动轮播图效果
  4. hashtable是线程安全的吗_Java程序猿必知:线程安全ConcurrentHashMap和Hashtable有啥区别...
  5. mac中sublime运行html,Mac系统下Sublime Text直接运行JavaScript调试控制台
  6. java如何新建一个空的压缩包_如何在Java中创建zip文件
  7. ggplot2如何实现1页多图
  8. ObjC学习8-重头戏来了!Foundation框架
  9. 【Android MyEclipse】no projects are found to import 如何解决
  10. Android Activity概述