使用MEF加载多个插件实例

时间:2010-06-02 21:00:36

标签: c# inversion-of-control mef

在我的上一个应用程序中,使用MEF加载插件很顺利,但现在我遇到了一个新问题。我有一个解决方案,我在这个问题的最后解释,但我正在寻找其他方法来做到这一点。

假设我有一个名为ApplianceInterface的界面。我还有两个从ApplianceInterface继承的插件,我们称之为Blender和Processor。现在,我希望在我的应用程序中有多个Blender和Processor,但我不确定如何正确实例化它们。

之前,我只是使用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来填充Appliances。我需要能够创建任意数量的Blender和Processor对象。

现在,从文档中我了解到[PartCreationPolicy(CreationPolicy.NonShared)]每次都允许MEF创建一个新实例,但是有一种类似的“神奇”方法来使用MEF创建特定数量的实例吗?到目前为止,我依靠[Import][ImportMany]来解决程序集。

我唯一的选择是使用全局容器,然后使用GetExportedValue&lt;&gt;?手动解析导出我试过GetExportedValue&lt;&gt;而且这个实现对我来说确实很好,但是我很好奇是否有更好,更可接受的方法来做到这一点。

更新

我刚刚意识到一个很大的错误,并且GetExportedValue&lt;&gt;不是我真正想要的。我正在迭代IEnumerable,当我得到匹配(基于一些参数)时,我想实例化当前值的新对象。 GetExportedValue&LT;&GT;在我有两个导出ApplianceInterface的不同插件的情况下,最终会失败。

我认为我的问题现在不同了,可能是C#特定的。

1 个答案:

答案 0 :(得分:2)

ExportFactory正在寻找,但它目前仅在Silverlight中可用。以下是一个解释如何在桌面上处理此问题的问题:Multiple Instances of a single MEF DLL