c# - MEF - 我是否需要实现 IPartImportsSatisfiedNotification

标签 c# configuration build mef

public interface IPlugin
{
    public bool execute();
}

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

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

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

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

我说得有道理吗?!

最佳答案

我不确定是否可以使用 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

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

尼克

关于c# - MEF - 我是否需要实现 IPartImportsSatisfiedNotification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1355454/

相关文章:

c# - 如何为 DevExpress WPF GridControl 行着色?

c# - ASP.NET C# Azure documentDb 类库不工作

c# - 将 C++ 结构编码(marshal)到 C# 的最有效方法是什么?

c# - 如何在 C# 中表达这些值

Spring Boot : Is it possible to use external application. 带有胖 jar 的任意目录中的属性文件?

javascript - 为什么我的复选框会禁用其他值?

configuration - 是否有 gnuplot 配置文件?

build - 链接器和 makefile 之间有什么区别?

ant - 调用 build.xml 并从另一个 build.xml 文件中的目标运行

build - 如何以编程方式构建 Visual Studio 解决方案?