代码示例托管地址: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使用就学会了。关于更多的导入导出等内容,后面将具体讨论。