博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MEF入门之不求甚解,但力求简单能讲明白(四)
阅读量:5115 次
发布时间:2019-06-13

本文共 2925 字,大约阅读时间需要 9 分钟。

上一篇我们已经可以获取各种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,值为.txt    public 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类型元数据,并且元数据的名字为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,值为.txt    public 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

你可能感兴趣的文章
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
【转】 FPGA设计的四种常用思想与技巧
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
图论例题1——NOIP2015信息传递
查看>>
uCOS-II中的任务切换-图解多种任务调度时机与问题
查看>>
CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>