2011-11-19 206 views
2

我對依賴注入有點新。我已經爲一些在構造函數中傳入其依賴項的類進行了設置,但是我有一些構造函數使用像Stringboolean這樣的基元。顯然這些需要從構造函數中刪除,如果我要爲該類使用依賴注入。依賴注入與非類

對於這樣的情況,什麼是「最佳」做法?使構造函數只取得依賴關係,併爲類需要的所有基元提供setter方法?

+0

您定位哪種技術? 。淨? Java的?還有別的嗎? – Steven

+0

你喜歡分享一個具體的例子嗎? – Steven

回答

2

我的觀察是,在大多數情況下,具有構造函數的類既具有依賴性又具有基元,破壞了Single Responsibility Principle或者至少會導致不太乾淨的設計,從而導致容器配置更脆弱和更難了解。

在大多數情況下(如果不是全部的話),那些原語是配置值,例如連接字符串,調試選項等。

有幾種方法可以改變你的設計來解決這個問題:

  1. 在這種情況下,你都打破了SRP,提取代碼到它自己的類型。以this example爲例,其中NotifyCustomerHandler需要string notificationServiceUrl,而該string應該已被封裝成某種NotificationService
  2. 另一種選擇是將類型的配置值提取到它自己的類型中。在NotifyCustomerHandler的情況下,它可能取決於INotifyCustomerHandlerConfiguration。在過去,我曾經擁有一個單一的IMyApplicationConfiguration接口,以及應用程序需要的所有配置值,但是我得出這樣的結論:這是一個糟糕的主意。這打破了Interface Segregation Principle,你的單元測試將開始受到可讀性和可維護性的影響。
  3. 當你沒有破壞SRP並且注入一個配置對象是不實際的(當你有一個單一的原語或者獲得太多配置接口,或者你只是不喜歡這個選項)時,你可以改變這些構造函數公共財產的論據。這將允許你(用大多數容器)註冊一個委託,它將在創建後配置實例,編譯器可以通過這種方式爲你進行驗證。
+0

感謝您深思熟慮的答案。我的構造函數當前接受一個包含JSON或XML的字符串。我可以將它解釋爲它自己的類型,也許可以是'Resource'或其他東西。但是爲了讓'String'進入這個類來構建'Resource',在嘗試構建'Resource'對象時似乎會遇到同樣的問題。看起來我唯一的選擇是#3,做一個我可以設置的屬性 - 這只是感覺不對。 – skaz

4

顯然,這些需要從構造函數中刪除,如果我使用依賴注入該類

不,「顯然」。您可以保留這些參數以及具有注入的依賴關係。

如果類需要這些參數進行正確的初始化,它們需要成爲構造函數的一部分。

+0

我知道顯然會咬我:)所以,如果我確實需要在構造函數中,我該如何去使用依賴注入? – skaz

+0

@skaz - 你只需傳遞依賴關係。還是你的意思是詢問IoC容器? – Oded

+0

是的,也許這是一個術語,我不知道。我試圖通過在類的外部定義對象圖來注入依賴關係。請參閱我對Steven的回答的評論,以瞭解我正在嘗試做什麼。謝謝你的幫助。 – skaz

1

類應該採取它需要的任何依賴關係,以執行它的功能。這兩個其他服務委託一些任務,以及原始依賴(通常是一些配置值)。

任何非平凡的容器都會迎合這種情況,並允許您這樣做。 Here's for example how Castle Windsor does it