上一篇我们已经可以获取各种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>();//获得所有导出的部件(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,你入门了没有。

最恨天下文章一大抄,请不要转载。

MEF入门之不求甚解,但力求简单能讲明白(四)的更多相关文章

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

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

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

    在上一篇文章中,我们已经学到了很基本的MEF概念和使用方法. 但我们导出的是一个object类型的实例,只能用来tostring,没有引用部件类库,也不能用里面的成员方法. 本篇,我们逐渐往简单的文件 ...

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

    起因:工作需要针对不同类型的文件做不同的处理.打个比方,txt文件,直接打印,doc文件,直接发email,jpg文件,上传xxx相册站点. 其实这个问题在学习最基本的工厂模式的时候早已经解决了,稍有 ...

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

    上一篇我们已经获得了制定类型的实例,但我们还无法对其进行有效的控制. 我们用ExportMetadata属性可以对具体的某个实例做标记,相当于命名.这么理解不知道对否. 在IPart项目中添加一个接口 ...

  5. 『NiFi 学习之路』入门 —— 下载、安装与简单使用

    一.概述 "光说不练假把式." 官网上的介绍多少让人迷迷糊糊的,各种高大上的词语仿佛让 NiFi 离我们越来越远. 实践是最好的老师.那就让我们试用一下 NiFi 吧! 二.安装 ...

  6. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  7. Nodejs入门-基于Node.js的简单应用

    服务端JavaScript 众所周知的,JavaScript是运行在浏览器的脚本语言,JavaScript通常作为客户端程序设计语言使用,以JavaScript写出的程序常在用户的浏览器上运行.直至N ...

  8. 机器学习入门 一、理解机器学习+简单感知机(JAVA实现)

    首先先来讲讲闲话 如果让你现在去搞机器学习,你会去吗?不会的话是因为你对这方面不感兴趣,还是因为你觉得这东西太难了,自己肯定学不来?如果你觉的太难了,很好,相信看完这篇文章,你就会有胆量踏入机器学习这 ...

  9. 相比之前其他几个入门的, 推荐: 简单vue2 入门教程

    注意:Vue.js 不支持 IE8 及其以下 IE 版本.       具体可以看下  http://www.runoob.com/vue2/vue-tutorial.html 以下是学习过程 Vue ...

随机推荐

  1. 深入了解Java程序执行顺序

    Java中main方法,静态,非静态的执行顺序详解 Java程序运行时,第一件事情就是试图访问main方法,因为main相等于程序的入口,如果没有main方法,程序将无法启动,main方法更是占一个独 ...

  2. js笔记——call,apply,bind使用笔记

    call和apply obj.call(thisObj, arg1, arg2, ...); obj.apply(thisObj, [arg1, arg2, ...]); 两者作用一致,都是把obj( ...

  3. javascript实现汉诺塔动画效果

    javascript实现汉诺塔动画效果 当初以为不用html5也很简单,踩了javascript单线程的大坑后终于做出来了,没事可以研究下,对理解javascript的执行过程还是很有帮助的,代码很烂 ...

  4. javaweb回顾第九篇EL表达式

    前言:关于EL表示式开发用的非常多,现在我们回顾一下关于如果去操作EL表达式 1:EL表达式语法 所有EL表达式都是由{开始}结束,表达式中用.和[]操作符来访问数据比喻${user.userName ...

  5. Javascript单元测试之QUnit

    首先去Qunit官网下载. Qunit有一个js脚本文件和一个css我们在页面中引入它. <script src="qunit-2.0.1.js"></scrip ...

  6. C# XmlReader

    一个非常全面的XML解析类 using System; using UnityEngine; using System.Xml; using System.Collections; using Uni ...

  7. PCurve - Curve on Surface

    PCurve - Curve on Surface eryar@163.com Abstract. 本文通过给出曲面上曲线PCurve的定义来对OpenCascade中的Curve On Surfac ...

  8. PHP扩展开发入门

    原文:http://www.orlion.ga/1090/ 写一个最简单的将字符串全部变成大写的函数: <?php function my_toupper($str) { return strt ...

  9. 深入理解CSS中的长度单位

    前面的话 本文分为绝对长度单位和相对长度单位来介绍CSS中的长度单位的主要知识 绝对长度单位 绝对长度单位代表一个物理测量 像素px(pixels) 在web上,像素px是典型的度量单位,很多其他长度 ...

  10. hdu 1241 Oil Deposits (一次dfs搞定有某有)

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> us ...