起因:工作需要针对不同类型的文件做不同的处理。打个比方,txt文件,直接打印,doc文件,直接发email,jpg文件,上传xxx相册站点。

其实这个问题在学习最基本的工厂模式的时候早已经解决了,稍有点面向对象基础的,都可以写出这样一个文件管理器。再有新类型文件处理的时候,只需要在加一个实现类,再在工厂里面加一个if判断,返回一个具体的处理实例即可,上层不必改动。

要干掉工厂里面的if,则必须要请出ioc容器了。MEF就是微软自家的托管可扩展框架,在这里被我用成了ioc容器,其他的功能,不求甚解。

我们先拿MEF练练手,再应用到具体的项目中。概念什么的先扔到一边。

新建一个控制台应用程序项目和一个类库项目,两个项目均引用MEF库。类库项目中新建三个类文件。

using System;
using System.ComponentModel.Composition; namespace Parts
{
[Export(typeof(object))]//表示此类需要导出,导出的类型为object
public class TxtFileHandler
{
public void Process()
{
Console.WriteLine("处理文本文件");
}
}
}

其余的就不贴了,只是类名和输出语句不同。

主程序:

using System;
using System.ComponentModel.Composition.Hosting; namespace meftest
{
class Program
{
//容器,装东西用的。具体装什么先不管。
private static CompositionContainer container;
static void Main(string[] args)
{
//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<object>();//获得所有导出的部件(object类型的)。
foreach (var item in exports)
{
Console.WriteLine(item.Value);
}
Console.ReadLine();
}
}
}

编译两个项目,将生成的类库文件Parts.dll拷贝到主程序的bin\debug文件夹

运行主程序:

可以看到,打印出了类名(object.ToString())。我们已经成功的创建了三个类的实例,但主程序并没有引用这个类库。

也可以说,我们将类的实例成功的注入到了主程序。

从这个小例子,我们可以学到,使用MEF三步骤:1、导出所需的类型(部件),2、在合适的目录(AssemblyCatalog、DirectoryCatalog)中查找。3、将找到的部件加入到容器。

之后你就可以使用容器中的已经New好的实例了。

注意:

在TxtFileHandler这个类上面的标记[Export(typeof(object))],表示此类需要导出,而且导出的类型为object

在main函数中,var exports = container.GetExports<object>();//获得所有导出的部件(object类型的)。

导出的类型和要获得的类型必须一致,这种一致性被称作为契约。

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

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

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

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

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

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

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

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

  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. AutoMapper的简单使用

    接触AutoMapper已经有两年多的时间了,在ORM框架中,它使持久层对象与DTO对象之间的转换变得相当简单. 随着负责的项目的增多,使用的技术框架一多起来,很多具体的技术点难免记不清, 加上同时兼 ...

  2. MySQL 5.7新特性之Generated Column(函数索引)

    MySQL 5.7引入了Generated Column,这篇文章简单地介绍了Generated Column的使用方法和注意事项,为读者了解MySQL 5.7提供一个快速的.完整的教程.这篇文章围绕 ...

  3. 通过 Redis 实现 RPC 远程方法调用(支持多种编程语

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/101.html?1455869487 我发现经常研究并且为之兴奋的一件事就 ...

  4. [Linux基础]Linux基础知识入门及常见命令.

    前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1:192.168.40.11Linux ip:192.168 ...

  5. Atitit main函数的ast分析  数组参数调用的ast astview解析

    Atitit main函数的ast分析  数组参数调用的ast astview解析 1.1. Xxcls.main(new String[]{"","bb"}) ...

  6. Jenkins的插件管理(安装和更新插件)

    使用Jenkins的编译部署项目需要依赖各种插件 下面安装Jenkins的各种插件: 1.登录Jenkins进入以下界面: 2.点击 系统管理 : 3.点击 管理插件 : 4.点击 可选插件 选择你需 ...

  7. Android 坐标系和 MotionEvent 分析、滑动

    1.Android坐标系 在Android中,屏幕最左上角的顶点作为Android坐标系的原点,这个点向左是X轴正方向,这个点向下是Y轴正方向. 系统提供了getLocationOnScreen(in ...

  8. 当你还在纠结于ORM的性能时,我已经远远的把你抛在脑后

    最近找工作面试,问到一些过去的工作和项目经验.我把公司用到的ORM框架(LLBL Gen)拿出来谈一谈,说一下他的优势,对方却一直追问ORM的好处,性能方面的问题,让我有时候都不知道如何回答,产生了不 ...

  9. 截取js数组中某段值(slice)

    // var a = [1,2,3]; // console.log(a.slice(1)); >>[2, 3] 从索引1开始截取. // console.log(a.slice(1,2) ...

  10. js中关于value的一个小知识点(value既是属性也是变量)

    今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻. [1]以下这种情况是常见情况,会弹出“测试内容” <input type="button" v ...