清明时节雨纷纷啊,本打算回趟老家的,后来想想还是算了,人多,又下雨。闲话不多说了,上一篇中,我们了解了一些基本概念,如Export、Import、Catalog等,本篇就Catalog,进行更加深入的讲解。
一、框架中的Catalog
在MEF框架中,包含了4种Catalog,所有的Catalog的是从System.ComponentModel.Composition.Primitives名称空间下的ComposablePartCatalog抽象类派生下来。
- AssemblyCatalog:表示从程序集中搜索部件的目录。
- DirectoryCatalog:表示从文件系统的指定路径中,搜索程序集,从而搜索部件。
- TypeCatalog:表示从指定的类型集合中,去搜索相应的部件。
- AggregateCatalog:聚合目录,可以添加上面所说的所有目录,从而进行多方面的部件搜索。
二、自定义Catalog
虽然MEF提供了4种Catalog已经能满足我们很多需求,但也并非所有时候都尽如人意。如果无法满足,我们可以通过自定义Catalog来完成我们所需要的部件搜索。
自定义Catalog和系统实现的Catalog类似,我们通过继承System.ComponentModel.Composition.Primitives空间下的ComposablePartCatalog
类,并且覆写掉基类的方法即可。
上图是ComposablePartCatalog
类中提供的方法,我们要实现自己的Catalog,必须要覆写掉Parts属性,如有特别需要处理的,我们还可以覆写GetExports方法,此方法默认的调用了Parts属性,进行进一步的输出。
三、综合示例
本次的示例依然很简单,我们通过使用MEF提供的四种Catalog,来获取Part,并且将获取到的Part类型输出到控制台中。解决方案如下:
其中MEFParts为一个类库项目,并且生成输出路径是在MEFApplication输出路径下的Parts目录中,两个项目的Classes文件中,我们都是很简单的定义了没有任何实现的类,然后输出了object(即Export(typeof(object))),本次示例的Contract是object。
Classes中定义如下:
1 | namespace MEFParts { |
Program中,我们输出了所有的Part,代码如下:
1 | namespace MEFApplication { |
其中:using MEF = System.ComponentModel.Composition.Hosting
;
四、总结
本篇文章的内容依然很简单,虽然简单,但这是MEF中很核心的东西,所以单独提出来。现在,我们熟悉了Catalog了,下一篇,我们开始说Export、Import。另外说一下,这系列的文章都是针对.NET Framework 4.0中自带的,因为目前Codeplex上的MEF框架已经更新了很多内容,难免有所不同,这里只作为参考。