我對依賴注入有點新。我已經爲一些在構造函數中傳入其依賴項的類進行了設置,但是我有一些構造函數使用像String
或boolean
這樣的基元。顯然這些需要從構造函數中刪除,如果我要爲該類使用依賴注入。依賴注入與非類
對於這樣的情況,什麼是「最佳」做法?使構造函數只取得依賴關係,併爲類需要的所有基元提供setter方法?
我對依賴注入有點新。我已經爲一些在構造函數中傳入其依賴項的類進行了設置,但是我有一些構造函數使用像String
或boolean
這樣的基元。顯然這些需要從構造函數中刪除,如果我要爲該類使用依賴注入。依賴注入與非類
對於這樣的情況,什麼是「最佳」做法?使構造函數只取得依賴關係,併爲類需要的所有基元提供setter方法?
我的觀察是,在大多數情況下,具有構造函數的類既具有依賴性又具有基元,破壞了Single Responsibility Principle或者至少會導致不太乾淨的設計,從而導致容器配置更脆弱和更難了解。
在大多數情況下(如果不是全部的話),那些原語是配置值,例如連接字符串,調試選項等。
有幾種方法可以改變你的設計來解決這個問題:
NotifyCustomerHandler
需要string notificationServiceUrl
,而該string
應該已被封裝成某種NotificationService
。NotifyCustomerHandler
的情況下,它可能取決於INotifyCustomerHandlerConfiguration
。在過去,我曾經擁有一個單一的IMyApplicationConfiguration
接口,以及應用程序需要的所有配置值,但是我得出這樣的結論:這是一個糟糕的主意。這打破了Interface Segregation Principle,你的單元測試將開始受到可讀性和可維護性的影響。感謝您深思熟慮的答案。我的構造函數當前接受一個包含JSON或XML的字符串。我可以將它解釋爲它自己的類型,也許可以是'Resource'或其他東西。但是爲了讓'String'進入這個類來構建'Resource',在嘗試構建'Resource'對象時似乎會遇到同樣的問題。看起來我唯一的選擇是#3,做一個我可以設置的屬性 - 這只是感覺不對。 – skaz
類應該採取它需要的任何依賴關係,以執行它的功能。這兩個其他服務委託一些任務,以及原始依賴(通常是一些配置值)。
任何非平凡的容器都會迎合這種情況,並允許您這樣做。 Here's for example how Castle Windsor does it。
您定位哪種技術? 。淨? Java的?還有別的嗎? – Steven
你喜歡分享一個具體的例子嗎? – Steven