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/