Managed Extensibility Framework(MEF)是微软的一个用来扩展.NET应用程序的框架,它最初为了满足Visual Studio里的编辑器的需求,比如说,延迟加载所有东西和细粒度协定。随着托管代码慢慢地取代基于COM的扩展模型,MEF框架也逐渐成型。
MEF是在Codeplex上开源的,并且现在已经是.Net 4.0的一部分。我们可以用它非常容易的实现插件框架。一个简单的示例如下(使用时需要添加System.ComponentModel.Composition.dll 的引用):
class Program { [Import] ILogger logger; void Compose() { var catalog = new AssemblyCatalog(this.GetType().Assembly); var container = new CompositionContainer(catalog); container.ComposeParts(this); } public static void Main(string[] args) { var p = new Program(); p.Compose(); p.logger.LogMessage("hello world"); } } interface ILogger { void LogMessage(string msg); } [Export(typeof(ILogger))] class ConsoleLogger : ILogger { public void LogMessage(string msg) { Console.WriteLine(DateTime.Now + ": " + msg); } }
这个例子比较简单,并不能很好的体现MEF带来的便利,MS官方的一个稍微复杂点的例子SimpleCalculator更合适一些。
不过,从这个例子中也可以看出MEF的基本工作方式:服务方通过ExportAttribute导出可提供的服务,使用者通过ImportAttirbute导入所需要的服务。它们之间彼此隔离而独立,服务对象的创建由MEF框架完成,并能提供单例、延迟加载等特性,而无须我们显式编码实现。
CodeProject上也有几篇不错的入门教程:
MSDN电子杂志上也有一篇介绍得非常详细的文章:Building Composable Apps in .NET 4 with the Managed Extensibility Framework
由于篇幅所限,对于MEF这里并不做更多的介绍,如果想更深入的了解它的话,可以参看MSDN官方文档:Managed Extensibility Framework,其Codeplex的主页上的文档也值得一看。另外,园子里也有一系列文章写的非常不错的:《MEF程序设计指南》博文汇总。