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

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

从官方MEF documentation

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

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

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

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

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

在此先感谢Jan

import export mef catalog
2个回答
2
投票

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

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);

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


0
投票

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

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

[InheritedExport]
public interface IMessageSender
{
}

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

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