在应用程序中宿主MEF其实非常简单,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件 (Parts)和当前宿主程序添加到容器中即可。首先需要添加MEF框架的引用,既 System.ComponentModel.Composition.dll,
可能会定义一个或多个导入(Import)和导出(Export)部件,然后通过MEF容器进行组合,其实也可以理解为“依赖注入”的一种实现。比如定义一个图书接口和一个接口的实现类,在此基础上使用MEF的导入导出特性:
public interface IService { void GetName(); } /// <summary> /// 导入 /// </summary> [Export(typeof(IService))] public class ComputerService : IService { public void GetName() { Console.WriteLine("Hello MEF"); } }
使用MEF的[System.ComponentModel.Composition.Export]对接口的实现进行导出设置,让接口的实现以容器部件 的方式存在,然后通过组合容器进行装配加载,这个过程中就包括了接口的实例化的过程。接下来就需要在MEF的宿主程序中定义一个接口的属性,并为其标注 [System.ComponentModel.Composition.Import]特性以实现接口实现类的导入
完整代码示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Reflection; namespace Test { public interface IService { void GetName(); } /// <summary> /// 导入 以接口设置为统一的导入接口可以变化框架为工厂 /// </summary> [Export(typeof(IService))] public class ComputerService : IService { public void GetName() { Console.WriteLine("Hello MEF"); } } class Program { /// <summary> /// 导入接口的实现部件(Part) /// </summary> [Import] public IService Service { get; set; } /// <summary> /// 宿主MEF并组合部件 /// </summary> private void Compose() { var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); //将部件(part)和宿主程序添加到组合容器 container.ComposeParts(this,new ComputerService()); Service.GetName(); } static void Main(string[] args) { Program p = new Program(); p.Compose(); } } }