2010-07-19 60 views
2

我的应用程序允许用户编写可在运行时实例化的插件(实现IPlugin)。在启动时,解析插件.dll的目录,注册所有可用的插件信息。在运行时提供了一个GUI,使用户可以创建任何插件的实例。这工作正常。在运行时使用MEF加载插件

但是现在我看到了MEF,并希望我可以做同样的事情,但以更加优雅的方式代码化。

我到目前为止与MEF工作:在启动时,我正在导入一个目录中的所有插件(导出IPlugin)并读出名称,类别,作者等信息......这些被编码为插件类的导出元数据属性。导入是懒惰的,所以所有的插件在启动时都没有实例化,这很重要。

问题是,现在我不明白的方式在运行时优雅实例化一个选择的插件提供的额外的复杂的插件的构造是其输入参考到IPluginHost(它需要一个进口构造立即做一些初始化)。

与plugininfo一起,我在启动过程中将相应的导出保存在字典中,因此当GUI要求实例化给定特定插件信息的插件时,我可以访问导出(其中Export.Value是我的实际IPlugin)。但是从那里我怎么能创建插件的一个实例,并与IPluginHost组成?

我收集我应该编写自己的ExportProvider,当有人询问IPluginHost,但我没有访问程序集或特定插件的类型,它可以让我将它添加到目录,添加目录和ExportProvider添加到容器并在该容器上调用.ComposeParts。

我希望我做了我的问题清楚,如果没有,让我来试试问题的短版: 是不是对MEF标准的用例有一个程序在启动的时候懒加载插件解析可用的插件信息,然后在运行时创建特定的实例给予特定的plugininfos?将很好的获得所涉及步骤的代码行。

回答

2

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

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

请注意ExportFactory仅在早期版本的MEF的silverlight版本中。要获得它在桌面版中,您目前需要codeplex(MEF 2 - 预览版1)的最新版本。通过构造函数导入ExportFactory也存在已知问题,因此请使用属性。

+0

您是否已经成功使用MEF 2预览版1,我遇到了与.NET 4.0 System.Components.Composition的装配冲突! ExportFactory特别是我想要的! – 2010-07-23 09:12:31

+0

对于迟到的回答感到抱歉。按照解释,我能够用ExportFactory解决我的问题。尽管使用.net 3.5。 – joreg 2010-07-25 11:27:14

0

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