查詢組合容器的一個很好的理由是什麼(除了調試和鬼混)。在實際應用場景中,爲什麼我要使用GetExports或GetExportedValues?除了不需要額外的課程之外,使用進口或進口產品的好處是什麼?爲什麼要查詢compositioncontainer?
4
A
回答
4
有三個方面的原因,我知道:
不可抗力
一些的3rdParty代碼(在你有沒有控制),通過反射的名稱實例化類。那些類將不得不在構造函數中自己處理它們的構成。
逐步重構
假設你已經有了一個大的現有的代碼庫,記不DI寫入。你想逐漸重構它來使用依賴注入。
假設您選擇一個隨機類並將其更改爲使用依賴注入:現在您通常會看到您將不得不更改任何實例化該類的類,而不是接收注入的依賴項。如果你改正了這一點,你還需要改變實例化類的類別等。
要避免級聯,必須在一次重構中立即更改整個代碼庫,臨時插入額外的組合根通常很方便。
不快樂DI
你已經有一個代碼庫,而不控制反轉,你是高興,你只是想添加一個或多個擴展點。或者,您可能已經在使用Service Locator模式而不是依賴注入。
-1
通常例如當您需要動態加載一個導出只。例如,動態依賴於某些輸入。
有很多情況下,導入 - 這是硬編碼到接收類 - 不起作用。
一個例子是生命。通過GetExport/GetExportedValue,我可以在對象生命週期外請求數據庫存儲庫並處理它。這對於可能需要或可能不需要存儲庫的元素來說非常方便,如果他們需要一個需要在沒有擺脫全班級的情況下襬脫它的話);
然後有一種服務類型的場景,我經常使用。我的服務器應用程序的服務不是初始化直到開始 - 這顯然意味着導入無法工作,這將創建服務創建時的整個對象結構,而不是服務啓動;)有充分的理由 - 例如配置可能會在特定的機器上啓動服務,並且我的某些服務的內存很重(在啓動時會拉動一個GB或兩個或十個緩存數據),所以當它沒有啓動時......它甚至不存在。
相關問題
- 1. SQL爲什麼sp比查詢要慢
- 2. 爲什麼我需要查詢界面?
- 3. 爲什麼查詢要求參數值?
- 4. 需要什麼查詢集?
- 5. 爲什麼命名查詢?
- 6. 這個sql查詢爲什麼要做鍵查找?
- 7. 爲什麼這個查詢需要這麼長時間?
- 8. 爲什麼我的SELECT查詢需要這麼長時間?
- 9. 爲什麼這個查詢需要這麼長時間?
- 10. 爲什麼這個EF查詢需要這麼長時間?
- 11. 爲什麼要將sql查詢轉換爲Zend_Db風格?
- 12. 我需要什麼樣的查詢?
- 13. 爲什麼多「查找」不SC查詢
- 14. 這些查詢爲什麼這麼慢?
- 15. GROUP BY查詢 - 爲什麼這麼慢
- 16. 我需要什麼加入?爲什麼我的查詢不起作用?
- 17. 爲什麼這個簡單的查詢需要永久?
- 18. 即使使用SSL,爲什麼要簽署REST查詢?
- 19. 爲什麼這個查詢需要整天在mysql上運行?
- 20. 這個子查詢爲什麼要執行表掃描?
- 21. 爲什麼這個查詢需要Oracle中的group by子句
- 22. HTML5 webSQL爲什麼要在事務中進行SELECT查詢?
- 23. LINQ查詢解析 - 爲什麼需要System.Linq命名空間?
- 24. 爲什麼以下查詢需要永久顯示結果?
- 25. 爲什麼我需要在查詢中使用CAST()?
- 26. SOAP - 爲什麼需要查詢更新的原始值?
- 27. 爲什麼這個SQL查詢需要DISTINCT?
- 28. 爲什麼在這個Linq-To-Xml查詢中首先需要?
- 29. 爲什麼我們需要創建原生查詢?
- 30. 爲什麼媒體查詢的順序在CSS中很重要?
使用'GetExport'獲取的'IDisposable'對象爲容器所有。容器將重複使用它們進行多次導入(除非您指定了'PartCreationPolicy。NonShared'),並在處理容器時放置它們。因此你不應該自己處理它們。管理生命週期的更好的解決方案是導入'ExportFactory'。 對於推遲初始化,您可以導入'懶惰'。 –
仍然有效。我有一個工作線程會加載驅動程序的場景。它累積它們直到它完成每16k個數據包。 BU它不希望所有可能的驅動程序實例化。 – TomTom