MEF核心笔记(2)Catalog的种类

清明时节雨纷纷啊,本打算回趟老家的,后来想想还是算了,人多,又下雨。闲话不多说了,上一篇中,我们了解了一些基本概念,如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 {

    [Export(typeof(object))]
    public class Class1 {

    }

    [Export(typeof(object))]
    public class Class2 {

    }

    [Export(typeof(object))]
    public class Class3 {

    }
}

Program中,我们输出了所有的Part,代码如下:

1
namespace MEFApplication {
    class Program {

        private static MEF.CompositionContainer _container;

        static void Main(string[] args) {

            var assemblyCatalog = new MEF.AssemblyCatalog(typeof(Program).Assembly);
            var directoryCatalog = new MEF.DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory + "\\Parts", "*.dll");
            var typeCatalog = new MEF.TypeCatalog(typeof(Class6), typeof(Class7));
            var aggregateCatalog = new MEF.AggregateCatalog(assemblyCatalog, directoryCatalog, typeCatalog);

            _container = new MEF.CompositionContainer(aggregateCatalog);

            var exports = _container.GetExports<object>();
            foreach (var exportValue in exports) {
                Console.WriteLine(exportValue.Value.GetType());
            }


            Console.ReadLine();
        }
    }
}

其中:using MEF = System.ComponentModel.Composition.Hosting;

四、总结

本篇文章的内容依然很简单,虽然简单,但这是MEF中很核心的东西,所以单独提出来。现在,我们熟悉了Catalog了,下一篇,我们开始说Export、Import。另外说一下,这系列的文章都是针对.NET Framework 4.0中自带的,因为目前Codeplex上的MEF框架已经更新了很多内容,难免有所不同,这里只作为参考。

本文涉及源码地址:https://github.com/prinsun/BlogDemo.MEF02