MEF 中的声明性服务要求

本文关键字:服务 声明 MEF | 更新日期: 2023-09-27 18:35:24

是否有一种声明性方法来指定对 MEF 中其他组件的引用?抱歉,我是 .NET 的新手,并找到了这个 msdn MEF 教程,它只在代码中声明引用。

我要问的是您是否可以指定此部分:

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

在某种属性文件中如下所示:

Requires-Component: ICalculator

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

MEF 中的声明性服务要求

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

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

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

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

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

  1. 配置文件
  2. 代码
  3. 中的配置(独立于组件代码)
  4. 组件类型的属性

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

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

在下一个 .NET 4.5 版本(当前为测试版)中,MEF 将支持现成的选项 2。它称为 MEF 约定模型。

或者,您可以只使用另一个依赖项注入容器。至少Castle Windsor,Spring.NET 和StructureMap支持外部配置文件。

但是,我建议在代码中配置选项 2.,因为它比外部配置文件更容易维护,同时仍然将配置与组件代码分开。看看其他一些容器,如Autofac或Ninject。