【问题标题】:MEF - Do I need to implement IPartImportsSatisfiedNotificationMEF - 我是否需要实施 IPartImportsSatisfiedNotification
【发布时间】:2009-08-31 01:41:24
【问题描述】:
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() 方法。

我说得有道理吗?!

【问题讨论】:

  • 看起来你的一些问题被打断了。它以“我遇到的问题是”结尾

标签: c# configuration build mef


【解决方案1】:

我不确定使用 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

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

尼克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多