我们已经成功的达到了目标,大量减少了if else。

不过在园子里面的文章大多,用的是Import、ImportMany。So,修改主函数。

using IPart;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Linq; namespace meftest
{
class Program
{
[ImportMany]
private IEnumerable<Lazy<IFileHandler, IPatMetadata>> fileHandlers;//警告,说没有赋值过。不用理会,MEF会自己导入的。
static void Main(string[] args)
{
//模拟数据。
string[] files = new string[] {
@"c:\xxoo\xxoo.txt",
@"c:\xxoo\ooxx.doc",
@"d:\测试目录\mm.jpg",
@"e:\电影\天海翼.avi",
};
Program p = new Program();
p.Compose();
foreach (var file in files)
{
string ext = System.IO.Path.GetExtension(file).ToLower();
var export = p.fileHandlers.SingleOrDefault(o => o.Metadata.Extension == ext);//根据扩展名,也就是元数据来找到对应的处理实例
if (export != null)
export.Value.Process(file);
}
Console.ReadLine();
}
private void Compose()
{
//AssemblyCatalog 目录的一种,表示在程序集中搜索
var assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);//此处这一句实际上没啥用,因为此程序集下没有任何我们需要的实例(各种handler)
//在某个目录下的dll中搜索。
var directoryCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory, "*.dll");
var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog);//聚合目录包含有2种搜索方式
var container = new CompositionContainer(aggregateCatalog);
container.ComposeParts(this);//将部件组合在一起。意思就是将所有Export的部件,装配到this实例中标记为Import、ImportMany的属性上。
}
}
}

不过这里有一个要注意的地方,不能在主函数内部来进行装配。原因如下图。

运行结果:

ok,现在MEF你已经入门了,再看大神们的文章心里也有点底了。本系列到此结束。

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

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

    上一篇我们已经可以获取各种FileHandler的实例和对应的元数据.本篇,我们做一个稍微完整的文件管理器. 1.修改接口IFileHandler,传入文件名 namespace IPart { pu ...

  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. 爬虫入门之爬取策略 XPath与bs4实现(五)

    爬虫入门之爬取策略 XPath与bs4实现(五) 在爬虫系统中,待抓取URL队列是很重要的一部分.待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪 ...

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

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

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

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

随机推荐

  1. C#将dll打包到程序中

    最近比较懒,加上内容也不多就懒得排版了,字放大了,看起来应该方便一点 直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 { public clas ...

  2. hibernate继承(转)

    http://justsee.iteye.com/blog/1070588 一.继承关系_整个继承树映射到一张表 对象模型(Java类结构) 一个类继承体系一张表(subclass)(表结构) Emp ...

  3. multiOTP配置安装

    https://code.google.com/p/google-authenticator/ 是google提供的OTP解决方案. http://www.multiotp.net/ 是一个开源otp ...

  4. Redis集群~StackExchange.Redis(10月6号版1.1.608.0)连接Twemproxy支持Auth指令了

    回到目录 对于StackExchange.Redis这个驱动来说,之前的版本在使用Proxy为Twemproxy代理时,它是不支持Password属性的,即不支持原始的Auth指令,而我也修改过源代码 ...

  5. 爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作

    回到目录 上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除 ...

  6. atitit.js浏览器环境下的全局异常捕获

    atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...

  7. SqlServer 错误1053:服务并未及时响应启动或控制请求

    sqlserver 的登录用户修改成域账户后,启动不了 解决方法: 计算器管理选择管理员组 将域账户加入到管理员组即可

  8. Jenkins的系统设置

    1.登录Jenkins进入以下界面: 2.点击 系统管理 3.点击 系统设置 (下图的系统设置是已经设置好的) 4.这里设置主要设置 Jenkins URL (这里我是测试的所以使用默认的)与 邮件的 ...

  9. (Task)任务异步(TAP)的使用

    任务有返回值例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...

  10. 每天一个linux命令(50):crontab命令

    前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...