2012-06-08 70 views
4

查詢組合容器的一個很好的理由是什麼(除了調試和鬼混)。在實際應用場景中,爲什麼我要使用GetExports或GetExportedValues?除了不需要額外的課程之外,使用進口或進口產品的好處是什麼?爲什麼要查詢compositioncontainer?

回答

4

有三個方面的原因,我知道:

  1. 不可抗力

    一些的3rdParty代碼(在你有沒有控制),通過反射的名稱實例化類。那些類將不得不在構造函數中自己處理它們的構成。

  2. 逐步重構

    假設你已經有了一個大的現有的代碼庫,記不DI寫入。你想逐漸重構它來使用依賴注入。

    假設您選擇一個隨機類並將其更改爲使用依賴注入:現在您通常會看到您將不得不更改任何實例化該類的類,而不是接收注入的依賴項。如果你改正了這一點,你還需要改變實例化類的類別等。

    要避免級聯,必須在一次重構中立即更改整個代碼庫,臨時插入額外的組合根通常很方便。

  3. 不快樂DI

    你已經有一個代碼庫,而不控制反轉,你是高興,你只是想添加一個或多個擴展點。或者,您可能已經在使用Service Locator模式而不是依賴注入。

-1

通常例如當您需要動態加載一個導出只。例如,動態依賴於某些輸入。

有很多情況下,導入 - 這是硬編碼到接收類 - 不起作用。

一個例子是生命。通過GetExport/GetExportedValue,我可以在對象生命週期外請求數據庫存儲庫並處理它。這對於可能需要或可能不需要存儲庫的元素來說非常方便,如果他們需要一個需要在沒有擺脫全班級的情況下襬脫它的話);

然後有一種服務類型的場景,我經常使用。我的服務器應用程序的服務不是初始化直到開始 - 這顯然意味着導入無法工作,這將創建服務創建時的整個對象結構,而不是服務啓動;)有充分的理由 - 例如配置可能會在特定的機器上啓動服務,並且我的某些服務的內存很重(在啓動時會拉動一個GB或兩個或十個緩存數據),所以當它沒有啓動時......它甚至不存在。

+0

使用'GetExport'獲取的'IDisposable'對象爲容器所有。容器將重複使用它們進行多次導入(除非您指定了'PartCreationPolicy。NonShared'),並在處理容器時放置它們。因此你不應該自己處理它們。管理生命週期的更好的解決方案是導入'ExportFactory '。 對於推遲初始化,您可以導入'懶惰'。 –

+0

仍然有效。我有一個工作線程會加載驅動程序的場景。它累積它們直到它完成每16k個數據包。 BU它不希望所有可能的驅動程序實例化。 – TomTom

相關問題