MEF:“可组合部件应包含至少一个导出”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MEF:“可组合部件应包含至少一个导出”相关的知识,希望对你有一定的参考价值。

从官方MEF documentation

可组合部件应至少包含一个导出。 可组合部件可以添加到容器明确表中,也可以通过使用目录创建。 MEF附带的默认目录通过导出属性的存在来标识可组合部件。

这是否意味着当使用默认目录时,此片段与相同文档不起作用,因为它不会导出任何内容?

class Program
{
  [Import]
  public IMessageSender MessageSender { get; set; }
}

我发现很难相信参加MEF混合的所有课程都必须“把食物带到餐桌上”,即使他们只是想“消费”。 上面的Program就是一个简单的例子:这个类没有任何东西可以添加到MEF组合中。

其次, 如何将“部件”明确添加到容器中? 例如,文件CompositionContainer对我没有任何帮助。

在此先感谢Jan

答案

可组合部件是可以导入另一部件的部件。这里的例子:

class Program
{
    [Import]
    public IMessageSender MessageSender { get; set; }
}

Program不是一个可组合的部分。它自动不会自动导入到另一个部分。您对IMessageSender的出口是可组合的部件。

您可以使用CompositionBatch向容器添加部分明确性,这允许您明确地将ExportComposablePart实例添加到容器中,或者通过扩展,您可以添加原始值:

var user = new User() { Name = "Matt" };
var batch = new CompositionBatch();
batch.AddExportedValue(user);

CompositionContainer.Compose(batch);

最后的调用是将您的零件添加到容器中。

另一答案

在你的例子中,程序必须调用container.SatisfyImports();才能检索IMessageSender

此外,您可以在接口上使用继承的导出,因此实现所述接口的所有内容都会自动导出。

[InheritedExport]
public interface IMessageSender
{
}

在这里查看我的代码:MEFMVVMCS.zip

以上是关于MEF:“可组合部件应包含至少一个导出”的主要内容,如果未能解决你的问题,请参考以下文章

什么是 MEF?

MEF 基础简介 三

MEF依赖注入实例

MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)

.Net插件编程模型:MEF和MAF

使用 MEF 传递参数/属性