MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要的库,Visual Studio 2010 Code Editor的扩展支持也是基于MEF构建的。
MEF组合过程
1.创建组件目录(如AssemblyCatalog)
2.创建组合容器CompositionContainer
3.创建一个组件
4.从组件容器获取其它组件功能定义,执行匹配组合
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); //创建一个程序集目录,用于从一个程序集获取所有的组件定义 var container = new CompositionContainer(catalog); //创建组合容器 var composablePart = new MyComponent(); container.ComposeParts(composablePart); //=获取ExportDefinition并创建实例组合在一起
上面代码有一个问题,如果程序集过大,会导致速度很慢,毕竟会搜索程序集,所以可以改为下面这种方式来实现:
下面基于一个具体事例:
TypeCatalog cat = new TypeCatalog(typeof(IRepository<T_JSSDD_DDZB_SXPZ>), typeof(IRepository<T_JSSDD_DDZB_SBXM>), typeof(IRepository<T_JSSDD_DDZB_SXPZVALUE>), typeof(IRepository<T_JSSDD_DDZB_XM_R_SX>)); //如果程序集比较小的话,可以使用AssemblyCatalog来初始化组合容器,程序集如果比较大,那么由于反射查找整个程序集 //所以性能上很差,建议使用上面TypeCatalog来初始化组合容器 AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(cat); container.ComposeParts(this, new T_JSSDD_DDZB_SBXMRepository(), new T_JSSDD_DDZB_SXPZRepository(), new T_JSSDD_DDZB_XM_R_SXRepository(), new T_JSSDD_DDZB_SXPZVALUERepository() );
直接传入接口和类进行映射和其他IOC容器用法类似,速度会快很多,缺点就是灵活性少了。
贴点简单事例代码吧,看下用法,具体的机制大家慢慢研究吧,MEF基于net framework 4.0,不用引入第三方类库,使用也是挺方便的:
/// <summary> /// 导出特性 /// </summary> [Export(typeof(ICal1))] public class Class1 : ICal1 { public void C() { Console.WriteLine("实现二"); } } /// <summary> /// 导出特性 /// </summary> [Export(typeof(ICalculator))] public class MySimpleCalculator : ICalculator { public string Calculate(string input) { Console.WriteLine("已经实现的方法"); return null; } } public class Container { /// <summary> /// 导入 /// </summary> [Import(typeof(ICalculator))] public ICalculator ICalculator { get; set; } /// <summary> /// 导入特性 /// </summary> [Import(typeof(ICal1))] public ICal1 ICal1 { get; set; } //初始化容器 public Container() { AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this,new MySimpleCalculator(), new Class1()); } } static void Main(string[] args) { Container container = new Container(); Console.WriteLine("Enter Command:"); container.ICal1.C(); Console.WriteLine(container.ICalculator.Calculate("")); Console.Read(); }