MEF:“容器”的作用、寿命和知识是什么?

问题描述 投票:0回答:1

我正在使用 MEF,在示例中我看到了这段代码(我称之为 MEF 撰写代码):

var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts();

在大多数示例中,这是在启动程序类以及所有其他接口和类所在的同一源文件中完成的。

现在我想使用MEF,但我想知道这个容器是做什么的。据我猜测它会执行导出/导入映射,但是如果我有这段代码(来自 Windows 窗体应用程序)怎么办:

 [STAThread]
        static void Main()
        {
            Application.Run(new Form1());

        }

在 Form1 中,我想创建一个 Auditer 类型的对象(它具有标记为导入的 ILogger 类型的属性,并且我有一个实现 ILogger 标记为导出的类)。

我是否必须将 MEF 撰写代码放在 void Main() 中、Form1 的 Load 事件中或 Auditer 类的构造函数中?

只有当我将它(MEF 撰写代码)放入 Auditer 类的构造函数中时,它才能工作,但我读到的示例以某种方式让我知道您只需调用一次撰写代码。

mef
1个回答
2
投票

CompositionContainer
是在 MEF 中实际组成您的部分的类。

当您想使用MEF时,您需要始终将归因于导入定义的部分组合起来。如果您在

Form1
中有一个标有
[Import(typeof(ILogger))]
的属性,那么在某些时候,您需要 compose 您的 Form1 实例。

CompositionContainer
是实际执行此组合的类。它根据容器内包含的目录找到适当的导出
ILogger
,并构造类型、将导出与导入相匹配等。

MEF 采样仅“组合”一次的原因是,通常,使用 DI,您将在应用程序开始时构造和设置容器的单个实例,并且它将组合您的“主”窗口。如果将所有其他类用作主窗口的一部分,则它们将自动组合。 (例如,如果 Form1 组成一个 ILogger,但您的 ILogger 实现有一个自己的

[Import]
,它也将在该过程中组成。)

话虽如此,并没有固定的规则规定您不能多次创作。例如,在 WPF 和 Silverlight 中,MEF 经常无法构造你的对象,这意味着它不能自动为你组合你的对象。在这些情况下,常见的模式是使用 CompositionInitializer(在 Silverlight 中的框中,而不是在桌面中)根据静态目录让部件自行组合。 我最近在博客中介绍了这种 WPF 方法

对于 Windows 窗体,这可能不太必要,因为没有第三方产品(XAML 解析器)来构造您的类型。但是,如果您选择的话,您仍然可以使用相同的方法。

© www.soinside.com 2019 - 2024. All rights reserved.