【发布时间】:2010-06-02 21:00:35
【问题描述】:
在我的上一个应用程序中,使用 MEF 加载插件运行良好,但现在我遇到了一个新问题。我有一个解决方案,我会在这个问题的末尾解释,但我正在寻找其他方法。
假设我有一个名为 ApplianceInterface 的接口。我还有两个继承自 ApplianceInterface 的插件,我们称它们为 Blender 和 Processor。现在,我想在我的应用程序中有多个 Blenders 和 Processors,但我不确定如何正确实例化它们。
以前,我会简单地使用ImportMany 属性,并在调用 ComposeParts 时,我的应用程序会加载 Blender 和 Processor。例如:
[ImportMany(typeof(ApplianceInterface))]
private IEnumerable<ApplianceInterface> Appliances { get; set; }
我的 Blender 和 Processor 插件的属性如下:
[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(typeof(MyInterface)]
public class Blender : ApplianceInterface
{
...
}
但这最终为我做的是用一台搅拌机和一台处理器填充设备。我需要能够创建任意数量的 Blender 和 Processor 对象。
现在,从文档中我了解到 [PartCreationPolicy(CreationPolicy.NonShared)] 是允许 MEF 每次创建一个新实例的原因,但是是否有类似的“神奇”方法可以使用 MEF 创建特定数量的实例?到目前为止,我一直依赖 [Import] 和 [ImportMany] 来解析程序集。
我唯一的选择是使用全局容器,然后使用 GetExportedValue 手动解析导出吗?我已经尝试过 GetExportedValue 并且该实现对我来说确实工作得很好,但我只是好奇是否有更好、更被接受的方法来做到这一点。
更新
我刚刚意识到一个大错误,GetExportedValue 并不是我真正想要的。我正在迭代一个 IEnumerable,当我得到一个匹配项(基于一些参数)时,我想实例化一个当前值的新对象。如果我有两个都导出 ApplianceInterface 的不同插件,GetExportedValue 最终会失败。
我认为我的问题现在不同了,可能是特定于 C# 的问题。
【问题讨论】:
标签: c# inversion-of-control mef