【问题标题】:Good examples of MEF2 importsMEF2 导入的好例子
【发布时间】:2013-02-22 17:20:51
【问题描述】:

我以前使用过 MEF,但现在在使用较新的实现时遇到了问题。我正在导出从具有 [InheritedExport] 属性的基类继承的对象,并且正在尝试导入它们。

以前,我只需要一个带有 [ImportMany(typeof(mytype))] 的数组属性,然后使用 CompositionInitializer.SatisfyImports(this) 来使导入工作,但现在我有两个问题:

1) 导出位于不同的引用程序集中; 2)CompositionInitializer 似乎不存在于 4.5 框架中较新的 MEF 中。

我正在尝试创建一个 AggregateCatalog 来解决问题 #1,但不知道从哪里开始。

最后,我正在尝试导入一个可供整个 WPF 应用程序使用的集合,如果有人可以帮助我提出整体解决方案的话。

【问题讨论】:

  • 据我所知,MEF2 向后兼容 MEF。您要从 Silverlight 迁移到 WPF 吗?
  • 是的。这可以解释#2,即 CompositionInitializer。没有意识到那是 Silverlight 唯一的课程。

标签: c# mef mef2


【解决方案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) CompositionInitializer 似乎不存在于较新的 MEF 中 4.5 框架。

这仅适用于Silverlight。在WPF 上,您必须创建一个CompositionContainer 并使用它的SatisfyImports 方法。

CompositionContainer container = new CompositionContainer(catalog);
container.SatisfyImports(someObjectWithImports);

【讨论】:

  • 当我更清楚地看到我的问题时,我正在努力解决的是如何在我的 WPF 应用程序中的所有类之间共享目录。我不认为单例类是要走的路,但找不到任何应该如何完成的实际示例。我不必编写代码来在每个有导入的部分中创建目录。
  • @Random 你不应该太注意目录。创建目录并用于创建组合容器。组合容器是重要的容器。通常你有一个类来创建容器并管理它。此类是一种引导程序,您只需在应用程序的初始化阶段使用它。您实现的大多数其他类都不需要了解它。他们只是有出口和进口申报。如果你需要一些其他的类来组成一个对象,那么你可以将它传递给容器。
  • 或者创建一个静态类来管理容器配置和访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2010-11-05
  • 2010-09-30
  • 2010-11-07
  • 2010-12-12
相关资源
最近更新 更多