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() 方法。

我说得有道理吗?!

4

1 回答 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

希望这可以帮助。如果您仍然遇到问题,发布有关您的问题的更多信息会有所帮助。

缺口

于 2009-09-03T18:06:36.513 回答