1

来自官方MEF 文档

一个 Composable Part 应该至少包含一个export
可组合部件要么显式添加到容器中,要么通过使用目录创建。
MEF 随附的默认目录通过存在导出属性来标识可组合部件。

这是否意味着在使用默认目录时,来自相同文档的该片段将不起作用,因为它不导出任何内容?

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

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

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

提前致谢

4

2 回答 2

2

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

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

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

您可以使用 a 向容器显式添加部件CompositionBatch,这允许您向容器显式添加ExportComposablePart实例,或者通过扩展您可以添加原始值:

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

CompositionContainer.Compose(batch);

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

于 2011-07-14T11:29:22.730 回答
0

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

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

[InheritedExport]
public interface IMessageSender
{
}

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

于 2011-07-13T21:05:41.593 回答