【问题标题】:MEF: "A Composable Part should contain at least one EXPORT"MEF:“可组合部件应至少包含一个导出”
【发布时间】:2011-07-13 14:19:49
【问题描述】:
来自官方MEF documentation:
可组合部件应至少包含一个导出。
可组合部件要么显式添加到容器中,要么通过使用目录创建。
MEF 随附的默认目录通过存在导出属性来识别可组合部件。
这是否意味着当使用默认目录时,此 sn-p 格式的相同文档将不起作用,因为它不导出任何东西?
class Program
{
[Import]
public IMessageSender MessageSender { get; set; }
}
我很难相信参与MEF 组合的所有班级都必须“将食物端上餐桌”,即使他们只是想“消费”。
上面的Program 是一个简单的例子:这个类没有任何东西可以添加到MEF 组合中。
其次,
如何将部件“显式地”添加到容器中?
例如的文档CompositionContainer 对我没有任何帮助。
提前致谢
一月
【问题讨论】:
标签:
import
export
mef
catalog
【解决方案1】:
可组合部件是可以导入到另一个部件中的部件。这里的例子:
class Program
{
[Import]
public IMessageSender MessageSender { get; set; }
}
Program 不是可组合的部分。它本身不会自动导入到另一部分。 IMessageSender 的导出是可组合的部分。
您可以使用CompositionBatch 向容器显式添加部件,这允许您向容器显式添加Export 和ComposablePart 实例,或者通过扩展您可以添加原始值:
var user = new User() { Name = "Matt" };
var batch = new CompositionBatch();
batch.AddExportedValue(user);
CompositionContainer.Compose(batch);
最终的调用是将您的部件添加到容器中。
【解决方案2】:
在您的示例中,程序必须调用container.SatisfyImports(); 才能检索IMessageSender。
此外,您可以在接口上使用继承导出,因此实现所述接口的所有内容都会自动导出。
[InheritedExport]
public interface IMessageSender
{
}
在这里查看我的代码:MEFMVVMCS.zip