【问题标题】:Loading plugins at runtime with MEF使用 MEF 在运行时加载插件
【发布时间】: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 来说,拥有一个在启动时延迟加载插件以解析可用插件信息然后在运行时创建给定特定插件信息的特定实例的程序不是标准用例吗?获得所涉及步骤的代码大纲会很棒。

【问题讨论】:

    标签: c# dynamic plugins mef


    【解决方案1】:

    如果我理解正确,您正在寻找一种方法来动态创建多个插件实例,可能是同一个插件。

    您需要声明ExportFactory<IPlugin,IPluginMetadata> 类型的导入,然后根据元数据选择正确的工厂。 ExportFactory.CreateExport 将处理 IPlugin 实例所需的任何导入,例如您提到的 IPluginHost

    请注意,ExportFactory 仅在早期版本的 MEF 的 silverlight 版本中。要在桌面版中获得它,您目前需要来自codeplex 的最新版本(MEF 2 - Preview 1)。通过构造函数导入ExportFactory还有一个已知问题,所以使用属性。

    【讨论】:

    • 你在 MEF 2 Preview 1 上取得了成功吗,我遇到了与 .NET 4.0 System.Components.Composition 之一的程序集冲突! ExportFactory 正是我想要的!
    • 抱歉回答迟了。正如解释的那样,我能够用 ExportFactory 解决我的问题。不过使用 .net 3.5。
    【解决方案2】:

    您创建了 CompositionContainer 了吗?您可以使用它来请求特定的插件类型并实例化它们。目录将带您前往那里。您可以聚合多个目录(使用 AggregateCatalog),然后将结果传递给 CompositionContainer 的构造函数。当您请求特定的 IPlugin 类型时(只需跟踪导出的类型),您可以要求 CompositionContainer 为您实例化插件,它会自动为您执行构造函数注入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多