是否可以使用 MEF 插件 "bundles"?

Is it possible to have plugin "bundles" with MEF?

我目前正在扩展现有的 WPF 应用程序以利用各种扩展。主要是为了拥有一个通用的 UI 平台,该平台加载由使用它的特定团队开发的插件。 其中一些扩展可能相互依赖(例如树控件插件和 canvas,您可以在其中从树中拖动东西)。这可能(并且可取)与 MEF 相关吗?

我想过通过属于一起的插件导出的公共接口来执行此操作,但我不确定这对 MEF 来说是否是一个好的做法。

由于您正在使用 MEF 来管理依赖项,因此请按照依赖倒置原则来描述它们。

如果您的一个插件需要另一个插件才能正常工作,只需导入它的实现:

public interface ITreePlugin {}
public interface ICanvasPlugin {}

[Export(typeof(ICanvasPlugin)]
public class CanvasPlugin : ICanvasPlugin 
{
    // treePlugin must be imported
    [ImportingConstructor]
    public CanvasPlugin(ITreePlugin treePlugin) {}

    // ...
}

此示例允许将 任何 ITreePlugin 实现放入容器中。 此外,它 需要 ITreePlugin 实现以呈现在容器中(请注意,您可以进行可选导入)。这是你的 "plugin bundle".

不要将特定的插件实现结合在一起,因为这会使 MEF 的使用变得毫无意义。