1. MEF是什么
MEF(Managed Extensibility Framework), 顾名思义,它是Framework 4.0下的应用框架, 主要是用于创建一种轻量级,有很好扩展性的应用程序,它可以让客户端在不需要任何引用情况下发现和使用新的扩展方法,当然也可以使扩展库的开发人员很容易的发布新的扩展,避免很强的依赖,当然它不是第一种专门为应用程序的扩展性而设计的一种框架,但是它有自己的特点。
2. 程序扩展的问题
如果我们开发一个程序,往往要引用很多其他的控件,而我们很难在不修改任何code的情况下去引用新的控件,甚至有的时候我们没有这些控件代码的权限,所以往往第三方控件进行扩展的时候需要通知客户端的开发人员去对新的方法进行单独处理,而MEF可以相对更好的解决这些问题。
通常我们给第三方控件一个接口,第三方控件去实现它,然后通过API函数可以实现我们客户端和第三方控件的交互,这样就可以解决代码权限的问题,但是它本身也有自己的问题,因为第三方控件开发人员就会有很强的依赖问题。
3. MEF的特点
一般情况下,我们需要显示引用第三方控件(就是在项目里面加引用), 从而可以在代码里面去调用控件的方法,而MEF可以在不引用的情况下通过一种方法(composition)发现控件并调用他们的方法. 在MEF,其中的component 被称为“part”, 当一个"Part"被创建的时候,composition 引擎就会去发现其他part也满足条件去创建。
4. MEF控件的实现
MEF控件可以在类,属性和方法中加入属性[Export()]和[ExportMetaData()],例如
public interface INameMetadata
{
string Name { get; }
}
interface IController
{
}
[Export(typeof(IController))]
[ExportMetadata("Name", "Home")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : Controller { }
Notes: PartCreationPolicy 是说明客户端在创建Part的时候的方式,CreationPolicy.Shared 表示同一个container 在创建part的时候是单例共享的同一对象,CreatePoliicy.NoShared同一个container 在创建part的时候每次是不同的对象。
5. 调用MEF控件
在调用MEF控件的时候,我们首先要发现这个控件,MEF框架是通过控件所在的文件夹目录来发现控件的。
类CompositionContainer中有很多方法去发现控件并床架控件对象。
var controller = _container.GetExports<IController, INameMetadata>()
.Where(e => e.Metadata.Name.Equals(controllerName))
.Select(e => e.Value)
.FirstOrDefault();
6. MEF控件实现的另外一种方式
有时候我们要提供的MetaData可能很多,所以我们不能无休止的加[ExportMetaData(,)],那我们可以用另外一种方式去实现,创建一个类,实现ExportAttribute, 安装Step 4的例子我们可以做如下改变
[AttributeUsage(AttributeTarget.Class, AllowMultiple=false), MetadataAttribute]
public class ExportExtensionAttribute : ExportAttribute, INameMetadata
{
public ExportExtensionAttribute(string name):base(typeof(IController))
{
Name=name;
}
public string Name{get; private set;}
}
[ExportExtension("Home")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : Controller { }
6.总结
主要是记录MEF的一些特点和调用方式,具体的[Export][ExportMetaData][PartCreationPolicy], 需要在使用的过程中仔细学习,这三个Attribute都是MEF中比较重要的。