2010-07-19 62 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爲您實例化插件,並且它會自動爲您執行構造函數注入。