問題

有幾個問題已經發布了關於依賴注入的具體問題,例如何使用它和它的框架.但是,

什麼是依賴注入,什麼時候/為什麼應該或不應該使用它?

  最佳答案

依賴注入將依賴關係傳遞給其他物件或框架(依賴注入器)。

依賴注入使測試更容易,注入可以透過建構函式完成。

SomeClass()的建構函式如下:

 public SomeClass() {
    myObject = Factory.getObject();
}
 

問題: 如果myObject涉及諸如磁碟訪問或網路訪問等複雜任務,則很難在SomeClass()上進行單元測試.程式設計師必須模擬myObject並可能攔截工廠呼叫.

替代解決方案:

  • myObject作為引數傳遞給建構函式
 public SomeClass (MyClass myObject) {
    this.myObject = myObject;
}
 

myObject可以直接傳遞,使測試更容易。

  • 一個常見的替代方案是定義do-none建構函式.依賴注入可以透過setter完成. (h/[email protected]).
  • Martin Fowler 文件了第三個選項(h/[email protected]),其中類顯式地為程式設計師希望注入的依賴項實現介面。

在沒有依賴注入的單元測試中隔離元件更加困難。

2013年,當我寫這個答案時,這是 Google Testing Blog 的主題.它仍然是我的最大優勢,因為程式設計師在執行時設計中並不總是需要額外的靈活性(例如,服務定位器或類似模式).程式設計師常常需要在測試期間隔離類.