2012-02-17 53 views
0

我目前正在與MEF合作開發MVC Web應用程序,以便a)開發人員可以爲該網站開發插件,並且用戶可以選擇他們想要的帳戶插件。這意味着我的一些作文必須在應用程序已經啓動並且用戶已經登錄之後纔會發生(它進入數據庫,抓取插件的程序集並將它們添加到當前目錄中)。在運行時更新MEF目錄

它的工作方式是我有一些庫存儲在數據庫中,當用戶登錄時加載到AssemblyCatalog中,我可以在我的Composer中成功添加到我現有的AggregateCatalog中。但是,在我的一個庫中,我有一個IController合約沒有被導出,導致特定的小部件崩潰。我不完全確定如何強制MEF在啓動後重新組合。我在這裏張貼,希望有人對我有一些建議。

我的代碼是基於excellent blog series by Matt Abbott的,所以我很希望他會提供一些建議。

+0

感謝您修復鏈接,萊斯特。 :) 非常感激。 – 2012-02-18 16:08:09

回答

1

嘛,不能你只需加載所有可用的零件(無論哪個客戶有他們啓用),但使用延遲的實例化,無論是通過LazyExportFactory與元數據的組合來識別部件到客戶端系統?這樣你就不需要按需加載程序集,他們只是準備好了。

如果您希望從數據庫中動態讀取程序集並將其加載到AppDomain中,則可以將其封裝到新的AssemblyCatalog中,但要利用重新組合。例如,在那個早期版本中,我使用的是PartCreator<T,TMetadata>,它發展爲ExportFactory<T,TMetadata>附近的版本(但不包括在最終的.NET 4.0中)。如果更改[ImportMany][ImportMany(AllowRecomposition = true)],下一次你添加一個新的目錄,例如:

((AggregateCatalog)container.Catalog).Catalogs.Add(<assembly>); 

哪些應該重新構圖[ImportMany]PartCreatorExportFactory)實例。

不知道這會工作......我需要了解你的意圖架構之前,我可以說,它會或不會工作...

+0

馬修,你好!基本上,我使用的是您的博客系列第3部分中鏈接的代碼版本,沒有發生重大更改。我*可以*加載所有插件/小部件,但是通過我們對這個站點的計劃,這可能意味着爲所有客戶端加載了數百個程序集,這可能是不可能的。所以我在運行時按需加載。 我還沒有嘗試AllowRecomposition屬性,所以我會給這個旋轉,看看會發生什麼。 :) 感謝您的回覆! – 2012-02-18 16:06:54

+0

AllowRecomposition似乎適用於啓動後加載的程序集,只是這些程序集中的一個程序集具有IController導出,似乎不會爲ImportControllerFactory重新組合,因此對該控制器/操作的任何請求都會失敗。我願意向你發送一些代碼來看待,這會很酷嗎? – 2012-02-28 14:55:34

0

我進入這個作爲一個答案,即使這不是一個真正的答案,而是更多的結論。我的問題是這樣的:我在應用程序啓動時完成了我的所有MEF組合,然後在用戶登錄後嘗試將其全部分開。

實際上,我只需要推遲所有這些。讓用戶先登錄,然後根據用戶「安裝」的內容(從數據庫中提取程序集等)完成我所有的MEF組合,將該組合容器存儲在會話或其他存儲機制中(這樣我可以獲得導出根據需要構建頁面,小部件等),而我是金。我最初的問題是因爲試圖將一個方形釘子安裝到一個圓孔中而產生的。我的作文不需要登錄才能發生,不需要啓動。雖然我可能會使用MEF在我的應用程序中執行一些DI,但這與用戶組合是分開的。

不過,我要再次感謝Matthew Abbott在MEF和MVC上的精彩演講,這真的有助於推動這一應用的發展。 :)我沒有將他的答案標記爲答覆,但我確實贊成這個答案,以幫助他獲得更多的聲譽。