首先,最基本的还是先要知道MEF是撒,他是干嘛用的:http://msdn.microsoft.com/zh-cn/magazine/ee291628.aspx
(1)MEF:全称Managed Extensibility Framework(托管可扩展框架)。
(2)MSDN上说明:Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用程序的库。 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置。 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项。 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展。
(3)工作原理:(这个我看别人的复制黏贴了)
Export(导出): “Export”也就是我们常说的组件或者模块或者服务,它是部件向容器中的其他部件提供的一个值、功能或服务等;
Import(导入): "Import”,既扩展点,是组件,服务等接入系统的窗口,是部件向要通过可用导出满足的容器提出的要求,MEF 支持若干导入类型,其中包括动态导入、延迟导入、必备导入和可选导入;
Contract(协定):是Export和Import的一种约定,一种协议,只有Contract相匹配的Import和Export部件才能组装成功;
Catalog(目录):为了发现可用于组合容器的部件,组合容器将使用“Catalog”。 目录是一个对象,通过它发现可用部件, MEF 提供了用于从提供的类型、程序集或磁盘路径创建Catalog。
Compose(组合):在MEF中,容器将导入与导出匹配的这一过程我们称之为组合,部件由 MEF 组合,MEF 将部件实例化,然后使导出程序与导入程序相匹配。
先弄一个最简单的HelloWorld例子来试一下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.Composition; using System.Reflection; using System.ComponentModel.Composition.Hosting; namespace HelloMEF{ class Program { public string Message { get; set; } static void Main(string[] args) { Program program = new Program(); program.Run(); } private void Run() { SimpleHello simpleHello = new SimpleHello(); Message = simpleHello.Message; Console.WriteLine(Message); Console.ReadKey(); } } public class SimpleHello { public string Message { get { return "Hello World!"; } } } }
上面这个是普通的提取字符串,但是这样就紧耦合了。要把耦合给去掉,先添加一个引用:System.ComponentModel.Composition.dll,先要有一个宿主,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件(Parts)和当前宿主程序添加到容器中即可:
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this);
然后分别在两个类中加入[Import]和[Export]即可,导入和导出有许多种,譬如如果需要导入多个类的东西的话还需要[ImportMany]等操作:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.Composition; using System.Reflection; using System.ComponentModel.Composition.Hosting; namespace HelloMEF { class Program { [ImportMany] public IEnumerable<string> Message { get; set; } static void Main(string[] args) { Program program = new Program(); program.Run(); } private void Run() { //SimpleHello simpleHello = new SimpleHello(); //Message = simpleHello.Message; var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this); foreach (var msg in Message) { Console.WriteLine(msg); } Console.ReadKey(); } } public class SimpleHello { [Export] public string Message { get { return "Hello World!"; } } } public class HelloAgain { [Export] public string Message { get { return "Hello World Again!"; } } } }
这个要参考一下这个导入导出的,里面写的还是挺全的:
http://www.cnblogs.com/pszw/archive/2011/12/04/2276241.html http://www.cnblogs.com/pszw/archive/2011/12/09/2282755.html
这只是一个最简单的例子。其他的容我再深入的研究下~