MEF - 我需要实现IPartImportsSatisfiedNotification吗?

3
public interface IPlugin
{
    public bool execute();
}

我的所有“部件”都实现了这个IPlugin接口。我的部件显然具有导入/导出的需求和提供。

我正在编写一个构建+配置系统,用户可以动态选择他/她想要的内容,这将转化为一组被调用的插件。

例如,以下是插件列表:

(1) 安装X...导出“XTypeInstalled”

(2) 配置X...导入“XTypeInstalled”,导出“XTypeConfigured”

(3) 安装Y...导入“XTypeConfigured”

(4) 安装Z

(5) 配置A

现在,用户可以选择(1)、(3)和(4)...或者选择(1)、(2)、(3)

我面临的问题是,现在所有的插件作者是否都需要实现IPartImportsSatisfiedNotification?如果不需要,并且用户选择了(1)、(2)和(3)的工作流程,那么如何调用(3)的execute()方法呢?

我的意思清楚吗?!


看起来你的一些问题被截断了。它以“我遇到的问题是”结尾。 - Daniel Plaisted
1个回答

4

我不确定是否应该使用MEF来管理程序的运行流程。MEF是一个很好的选择,可用于定位和加载插件,但它是设计用于非常松散耦合的系统,因此您可能无法获得所需的控制级别。

例如,虽然依赖项解析过程将为任务提供其依赖项,但没有机会检查依赖关系结构。

当您想要保证任务仅执行一次,或者想要用另一个任务替换任务时,事情可能会变得棘手。

我的建议是您使用MEF来找到插件,但独立于MEF开发一个丰富的对象模型来执行它们。

例如:

[Export(typeof(IPlugin)), ExportMetadata("Name", "ConfigureX")]
public class ConfigureXPlugin : IPlugin { ...

接下来使用MEF来查找所有可用的插件:

public class BuildRunner {
  [ImportMany]
  Lazy<IPlugin, IPluginMetadata> plugins[];

  void RunBuild(...) {
    // Figure out which tasks should execute, in which order, and call each of them

希望这能帮到你。如果你仍然遇到问题,提供更多关于你的问题的信息会有所帮助。
尼克

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接