MEF基础指南——MEF首次接触

代码示例托管地址:MEF_First_Touch

简介

简单理解MEF就是.NET中的一个IOC框架。主要是为了增加开发的应用的扩展性的。目的其实和其他IOC框架一样,就是解耦。

何为IOC

IOC,即控制反转。

个人理解:
它其实是在接口的基础上进一步解耦,像我们一开始写接口,就是为了可以使用多种实现嘛,但是呢,你在使用过程中,在一个地方还是只能用一个(多个地方就要一个一个new,顶多用个工厂封装下,但你还得在用的地方告诉工厂使用哪个实现);
而此时IOC就可以有用了,它只需要你在使用的地方进行接口声明即可(顶多再加一些特殊的标识——看你用哪个IOC框架了),至于实例化哪个实现IOC框架来帮你做。这里不是你告诉IOC用哪个实现,而是告诉IOC我要什么样的处理,然后IOC来找对应匹配的实现。其实在这里面工厂和IOC很相似,甚至说不清,简单理解就是,工厂的实例化的控制权其实还是在具体使用工厂的地方,而IOC中实例化的控制权在IOC容器中。

下面举个例子描述下:

  • 工厂 —— 我到水果摊买水果,我告诉老板买啥水果,老板给我找对应的水果。 模式是:A——(B——C,D,E),B进行统筹管理
  • IOC —— 我到淘宝买水果,我告诉淘宝要啥水果,淘宝找出与我要的相匹配的水果。模式是:A——B——(C,D,E),B就进行接口匹配,找对应关系

如何使用

既然MEF是一个IOC框架,使用自然会需要以下三点:

  • 接口定义,相关实现
  • 接口声明 —— 使用
  • 通知IOC容器要处理啥

接口定义及相关实现定义

在MEF中实现的定义用导出来处理,本示例中,我们首先定义一个接口,然后添加一个实现,内容如下:

interface IStudy
{
    void Study();
}

[Export(typeof(IStudy))]
class MEFStudy : IStudy
{
    public void Study()
    {
        Console.WriteLine("Study MEF");
    }
}

使用实现

在MEF中要使用对应的实现,我们使用导入功能,代码如下:

[Import]
IStudy Study { get; set; }

调用内部方法则是:

Study.Study();

告诉IOC容器要处理的内容

在MEF中,这个处理里涉及的内容有容器和目录,具体使用如下:

//利用目录添加到容器
var catalog = new AssemblyCatalog(typeof(Program).Assembly);
var container = new CompositionContainer(catalog);
container.ComposeParts(this);

总结

至此,最简单的MEF使用就学会了。关于更多的导入导出等内容,后面将具体讨论。


奇葩史