【问题标题】:Multiple plugin instance loading with MEF使用 MEF 加载多个插件实例
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这是一个有趣的方法。因此,使用 MEF 来解析类工厂的单个实例,然后可以创建特定类型的多个实例。我认为它可以正常工作,但确实需要更多的实现,而只是调用 GetExportedValue。我的设备创建全部发生在管理厨房中所有设备的单个对象中,因此仅在该一个组件中需要 MEF 容器。但是,如果情况发生变化并且我需要在其他地方解决,我认为您的建议绝对是要走的路。
    • 在我意识到自己的想法存在根本缺陷(或缺乏)之前,这似乎适用于我的问题。我也可以扩展它来处理我的新问题,但这不是最好的解决方案。当我有两个 ApplianceInterface 时,我可以将一个字符串传递给类工厂以获取特定类型的 ApplianceInterface,因为可能有多个插件公开此接口,但我需要能够创建派生类的实例。一定有办法用 C# 魔法做到这一点,但我还没有弄清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多