2011-09-27 45 views
6

我認真地開始認爲IoC容器的使用激發了創建過度設計的解決方案(至少它激起我嘗試使用各種不必要的功能:)。IoC容器使用的反模式。爲什麼IoC容器如此複雜,並且如此「花哨」地使用?

這是同步我的社區「IOC」反模式列表中的一個時間的..

我簡短的經驗告訴大家,這是絕對足夠爲每個應用程序在啓動一次通話時解決方法來解決一些基礎設施的單身人士,並開始他們可以生產新的「小型生活時間糧食工廠」的「短暫對象工廠」。甚至爲了使這些工廠線程安全(例如,爲每個線程創建一個實例),通過在工廠中添加10條代碼線很容易實現......儘管如此,「庫與IoC工具的集成」使這些工廠更加簡單。攔截?只需創建自己的包裝...生活時間經理/依賴策略/父容器?在啓動程序中只調用Resolve一次,你就不會考慮這個問題。

您能否幫我理解爲什麼開發人員在不同的應用程序層調用Resolve幾次(通過傳遞容器或將委託傳遞給容器),然後有很多事情需要考慮?我真的擔心我錯過了什麼。

+2

好點。你可以去動這個嗎? –

回答

0

在我眼裏其他反模式是推動集裝箱「更深」,那麼實際bootsrapper的初始化。

例如Unity and WCF recommendations

引導程序在WCF應用程序是該服務的構造函數,那麼只要把容器初始化構造函數。我不明白推薦去編程wcf服務行爲和客戶服務主機工廠的理由:如果你想擁有「IoC容器免費」引導程序 - 這是荒謬的,如果你需要實現「IoC容器免費」服務合同 - 只需創建第二個「IoC容器免費」服務合同實施。

1

閱讀This

顯然有些不妥。新圖書館不應帶來額外的複雜代碼。

1

某些類型的IoC是反模式或可能在某些情況下。例如service locator antipattern。但是,如果您在應用程序的開始處使用構造函數注入 - 並且僅在那裏 - 那麼應該不會導致反模式。

在類中注入DI容器接口是構造函數注入的錯誤用法。如果DI不屬於班級的商業邏輯,那麼它不應該知道或依靠DI容器,也不應該依賴IKitchen。將DI容器注入某種輔助程序或服務與依賴注入容器一起工作是很好的,因爲它的目的是在DI容器上或其周圍工作。您提供的鏈接中的示例是濫用IoC。這並不意味着一般來說IoC是一種反模式。

我認爲正確的問題是「構造函數注入是否可以是反模式?」。到目前爲止,我從來沒有面對任何情況,也沒有看到任何例子,所以我會說「不」,直到我面對這樣的情況。

2

當我不清楚如何使用IoC容器時,我決定停止使用它,因爲我認爲這只是對簡單依賴注入的過度複雜化。

確實,即使沒有IoC也有可能陷入過度注射的情況。 前一段時間,我讀了一些ninject作者的帖子,這些帖子打開了我的想法。

正如您已經知道注射器只能在上下文根內使用。然而,爲了避免過度注射,我決定爲注射工廠引入一個例外規則。

在我的框架中,工廠(和工廠)可以使用注入器容器。工廠綁定在上下文根的容器中,因此可以注入。工廠成爲有效的依賴關係,並用於在其他對象內創建新對象,使用注入器容器來促進依賴關係注入。

+0

是的!我完全同意你在這裏。允許工廠使用容器是可以的,因爲有什麼選擇?手動「再次」新對象?我認爲人們太過於理解這些概念背後的理論,而不是將它們用作生產工具。 –