2010-06-29 154 views
2

我正在研究MEF作爲現有.NET應用程序中插件解決方案的解決方案。現有應用程序中的MEF全局組合容器

在我能找到的所有例子中,主應用程序創建一個CompositionContainer的實例並調用container.ComposeParts(this)。

問題是,我的應用程序並不完全建立在MEF上,所以在沒有MEF組件的對象圖中有一個洞。 所以我的對象層次結構可能是這樣的:

應用程序(MEF容器) - >對象B (無MEF) - >對象A(需要MEF 進口)

在這種對象層次,它是我不可能在應用程序中調用container.ComposeParts(this),並希望應用程序創建ObjectB並滿足ObjectA的Imports。

在全局公開CompositionContainer是否是一種很好的做法,這樣我就可以在晚於應用程序啓動時編寫ObjectA,還是必須重構我的整個應用程序以支持線性MEF對象圖?

回答

2

它是一個很好的做法,暴露 CompositionContainer中全球

我不會把它一個很好的做法,但它是一個合理的妥協,當它是不可能實行的控制原理的反轉到處都是施工。有時候,現有的代碼庫並不完全在你的控制之下,或者是.NET和本地代碼(如COM組件)的複雜組合,或者太大而不能重構。

在Silverlight中,來自XAML的對象的構造也在MEF的控制之外,所以Microsoft引入了基本相同的解決方案:默認的MEF容器可作爲全局訪問,並通過PartInitializer.SatisfyImports(this);進行調用。

請注意,遵循此模式將緊密地將全球的任何消費者向MEF以及用於公開它的全局變量發動衝突。不可能在其他應用程序或其他IoC容器中重新使用此代碼。這也會使單元測試複雜化。

相關問題