2012-03-15 59 views
9

我目前正在使用服務定位器(構造函數)依賴注入(DI)重構我的基於Zend Framework的PHP庫。我覺得它提高了我的代碼,但我不確定是否應該注入所有依賴項。服務定位器似乎更容易用於很多且不具體的依賴項。我有我仍然使用服務定位器訪問以下依賴項:依賴注入:我應該注入一切還是爲某些對象使用服務定位器?

  1. 一個Zend_Translate對象(我需要翻譯消息無處不在)。
  2. 甲從Zend_Locale對象(存儲當前語言)
  3. Zend_Config對象(很多事情是由ini文件配置)
  4. 實例的工具類的(對數組和字符串處理)

如果我注入這些依賴關係,他們會混亂我的構造函數,並分散特定的依賴關係。對於測試,我可以在運行測試之前在服務定位器中設置這些依賴關係。我的實用主義者說我做得很好,但純粹主義者說我應該一路走下去。

你會推薦爲DI這些類型的對象或不是?

+3

無法回答。你顯然知道有利弊。你有意識地做出決定。 – Gordon 2012-03-15 09:47:44

+0

嗯,問題是:你會推薦DI嗎?所以問題很清楚。 – markus 2012-03-15 09:53:49

+0

有很少的問題我upvote和投票結束。這是一個很好的問題,但這似乎取決於你自己決定。這是你的申請,你知道這個問題的優點和缺點。 – 2012-03-15 09:57:28

回答

18

當談到關於弄亂建設者的關注,這是最有可能的a code smell that the classes are violatingSingle Responsibility Principle。構造函數注入在這裏非常有用,因爲它使這更加明顯。

有些人還擔心注入其僅很少使用的依賴,而是that's not a problem either。談到創建對象圖時,性能很少成爲問題,即使是這樣,虛擬代理模式也可以修復它。

總之,我們沒有理由永遠使用服務定位器。總是有一個更好的選擇,涉及適當的控制反轉。

+2

中列出的原因。但是,在某些情況下,使用服務定位器是進行依賴關係反轉的唯一方法。例如,當一個類正在被不支持依賴注入的第三方框架實例化時。 – 2012-03-19 22:32:55