0

是否有一种声明方式来指定对 MEF 中其他组件的引用?抱歉,我是 .NET 新手,发现这个 msdn MEF 教程仅在代码中声明引用。

我要问的是你是否可以指定这部分:

[Import(typeof(ICalculator))]
public ICalculator calculator;

在某种属性文件中是这样的:

Requires-Component: ICalculator

正如你们中的一些人可能会说的那样,我正在尝试模仿 OSGi 的工作方式(Java 领域),尤其是其中的声明式服务部分。

4

2 回答 2

2

MEF 基于包含可组合部件的目录概念,这些部件导入和导出由合同名称标识的其他可组合部件。这是非常抽象的,但在大多数情况下,MEF 中的部分是通过导入依赖于其他类型的类型(例如,要创建对象图,根对象依赖于图下方的其他对象)。合同名称是类型的名称。

但是,您可以在 MEF 框架之上构建并创建您自己的具有依赖关系的部分。然后你将不再使用AssemblyCatalog(它适用于带有属性注释的类型),而是你必须实现你自己的ServiceCatalog,你可以从说“属性文件”构建它。ComposablePartDefinition您还必须通过从抽象类和抽象类派生来实现自己的部分ComposablePart。然后,MEF 将能够根据您使用自己的合同名称定义的导入和导出来创建部件并连接它们。

于 2012-05-25T14:00:06.120 回答
0

你在评论中写了这个澄清:

我希望我的代码保持独立于框架、中立,并且没有 MEF 或其他任何东西的痕迹。

当您查看其他依赖注入框架时,您会看到配置组件的三种常见策略:

  1. 配置文件
  2. 代码中的配置(与组件代码分开)
  3. 组件类型的属性

从您的评论来看,您似乎想避免第三种方法,因为它“污染”了依赖注入框架的组件代码。我不反对。

目前 3. 是 MEF 开箱即用支持的唯一方法。(您可以实现自己的ExportProviderComposablePartCatalog执行 1. 或 2.,但这是一个相当高级的用例)。

在下一个 .NET 4.5 版本(目前处于测试阶段)中,MEF 将支持开箱即用的选项 2。它被称为MEF 约定模型

或者,您可以只使用另一个依赖注入容器。至少Castle WindsorSpring.NETStructureMap支持外部配置文件。

但是,我会推荐选项 2. 代码中的配置,因为它比外部配置文件更易于维护,同时仍将配置与组件代码分开。看看其他一些容器,例如AutofacNinject

于 2012-05-25T20:25:35.577 回答