【发布时间】:2010-07-19 22:04:59
【问题描述】:
我的应用程序允许用户编写他们可以在运行时实例化的插件(实现 IPlugin)。启动时会解析插件 .dlls 的目录,注册所有可用的插件信息。在运行时提供了一个 GUI,允许用户创建任何插件的实例。这工作正常。
但现在我看到了 MEF,并希望我能做同样的事情,但在代码方面以更优雅的方式。
到目前为止我使用 MEF 所做的工作:在启动时,我正在导入目录中的所有插件(导出 IPlugin)并读出名称、类别、作者等信息...这些被编码为插件类的导出元数据属性。导入是懒惰的,所以所有插件都不会在启动时实例化,这很重要。
问题是现在我看不到一种在运行时优雅地实例化所选插件的方法,因为插件构造函数是一个导入构造函数,它正在导入对 IPluginHost 的引用。 (它需要立即进行一些初始化)。
与 plugininfo 一起,我在启动期间将各自的 Export 保存在字典中,因此当 GUI 要求实例化一个给定特定 plugininfo 的插件时,我可以访问 Export(其中 Export.Value 是我的实际 IPlugin)。但是从那里我如何创建插件的实例并使用 IPluginHost 组合它?
我认为我应该编写自己的 ExportProvider 来在有人要求时为 IPluginHost 提供服务,但是我无权访问程序集或允许我将其添加到目录的特定插件的类型,添加目录和 ExportProvider 到容器并在该容器上调用 .ComposeParts。
我希望我把我的问题说清楚了,如果没有,让我试试问题的简短版本: 对于 MEF 来说,拥有一个在启动时延迟加载插件以解析可用插件信息然后在运行时创建给定特定插件信息的特定实例的程序不是标准用例吗?获得所涉及步骤的代码大纲会很棒。
【问题讨论】: