之前我曾使用过MEF,但现在我遇到了更新的实现问题。我正在导出从基类继承的对象,它具有[InheritedExport]属性,并且我正在尝试导入它们。
之前,我只有[ImportMany(typeof(mytype))]的数组属性,并使用CompositionInitializer.SatisfyImports(this)来使导入工作,但现在我有两个问题:
1)导出在一个不同的引用程序集中; 2)在4.5框架中较新的MEF中似乎不存在CompositionInitializer。
我正在尝试创建一个AggregateCatalog来解决问题#1,但不知道从哪里开始。
最后,我正在尝试导入一个可供整个WPF应用程序使用的集合,如果有人可以在建议整体解决方案方面给我任何帮助。
答案 0 :(得分:1)
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));
有关目录的更多信息,请阅读this small article。
2)新的MEF中似乎不存在CompositionInitializer 4.5框架。
仅适用于Silverlight
。在WPF
,您必须创建CompositionContainer并使用其SatisfyImports
方法。
CompositionContainer container = new CompositionContainer(catalog);
container.SatisfyImports(someObjectWithImports);