2011-01-29 102 views
0

我有點迷路了MEF,MAF,Unity ...C#.NET 4.0窗體插件管理器

這個問題是關於Winform應用程序的體系結構。

我有一個主要的項目,其中包含一個主窗體和其他形式;

因爲我想包括模塊性,我想使用插件系統。

我想什麼做的是打開每個插件DLL文件主應用程序打開與按鈕,工具欄引用每個...

然後我想處置他們,直到他們被稱爲。

但我不希望所有的插件保存在內存中..只是爲了得到一個好的架構模型。

因此,首先有關.NET: 不dotNet的保存在內存中只有參考對DLL插件或全部插件代碼

我正在考慮使用MEF與LAZY集合的導入,但我需要首先實例化它們以獲取我的按鈕信息。所以第二個問題

如果我設置了進口代收到null,再次勞克的compose()功能,插件將負載或等待呼叫進行負載(懶惰)?

+0

你可以嘗試改述你的問題嗎?似乎有點困惑和一般。 – tomfanning 2011-01-29 12:56:19

回答

2

然後我想處置它們直到它們被調用。

相反檢查導入的對象,然後扔掉,你應該檢查進口metadata。您可以通過導入Lazy<IFoo,IFooMetadata>Lazy<IFoo,Dictionary<string,object>>來獲取此元數據。您可以使用ExportMetadata屬性將此元數據添加到導出。

因此,首先有關.NET:是否dotNet的只保留在內存中的DLL插件或所有插件代碼的參考?

加載程序集後,它將一直保留在內存中,除非卸載整個AppDomain。

另外,在.NET 4.0中沒有ComposablePartCatalog的開箱即用的實現,可以在不加載相應程序集的情況下查詢。但理論上講,如果將元數據存儲在程序集外的某個位置,可以完成這樣的工作。 MEF code on codeplex中有一個這樣的實現示例。

我想使用MEF與進口

使用懶進口未必會阻止加載組件的延遲集合的。如果您有對Lazy<IFoo>對象的引用,則至少必須加載包含IFoo的程序集。正如我上面所解釋的那樣,包含導出的IFoo實現的程序集也將在此時加載。

使用Lazy將只推遲一些構造函數的調用,希望能夠更快地啓動您的應用程序。