MEF - 我是否需要实施IPartImportsSatisfiedNotification

时间:2009-08-31 01:41:24

标签: c# configuration build mef

public interface IPlugin
{
    public bool execute();
}

我的所有“部分”都实现了这个IPlugin接口。我的部件显然有进口/出口要求/产品。

我正在编写一个build + config系统,用户可以动态地选择他/她想要的内容,这会转换为一组被调用的插件。

例如,这是一个插件列表:

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

我有意义吗?!

1 个答案:

答案 0 :(得分:4)

我不确定使用MEF来管理这样的程序的运行时流程。 MEF是查找和加载插件的绝佳选择,但它专为非常松散耦合系统而设计,因此您可能无法达到所需的控制水平。

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

例如,当您想要保证任务只执行一次,或者您想要将一个任务替换为另一个任务时,事情可能会很棘手。

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

E.g:

[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

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

尼克