我以前使用过MEF,但现在在新的实现中遇到了问题。我正在导出从基类继承的对象,该基类具有[IinheritedExport]属性,并试图将它们导入。
以前,我只需要一个带有[ImportMany(typeof(mytype))]的数组属性,并使用CompositionInitializer.SatisfyImports(this)来让导入工作,但现在我有两个问题:
1) 导出位于不同的引用程序集中;2) CompositionInitializer似乎不存在于4.5框架中较新的MEF中。
我正试图创建一个AggregateCatalog来解决问题#1,但不知道该从哪里着手。
最后,如果有人能帮助我提出整体解决方案,我将尝试导入一个可以供整个WPF应用程序使用的集合。
1) 导出位于不同的引用程序集中;
正如您所说,您将需要AggregateCatalog
来聚合多个目录。通常,包含零件的每个部件都需要一个目录(导出/导入)。这意味着您必须为这些加载的程序集中的每一个程序集使用AssemblyCatalog类。您可以通过加载的程序集所包含的某个类型访问这些程序集。下面是一个小示例,它将两个AssemblyCatalog添加到AggregateCatalog中。
AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(SomeClassInSomeAssembly).Assembly));
catalog.Catalogs.Add(new AssemblyCatalog(typeof(SomeClassInAnotherAssembly).Assembly));
有关目录的更多信息,您可以阅读这篇小文章。
2) 中较新的MEF中似乎不存在CompositionInitializer4.5框架。
这仅在Silverlight
上可用。在WPF
上,您必须创建一个CompositionContainer并使用其SatisfyImports
方法。
CompositionContainer container = new CompositionContainer(catalog);
container.SatisfyImports(someObjectWithImports);