依賴注入

編寫軟體可以採用的一種方法是在需要時建立依賴關係。這是編寫程式的一種直觀方式,也是大多數人傾向於教授的方式,部分原因是它易於遵循。這種方法的一個問題是它很難測試。考慮一種基於當前日期進行一些處理的方法。該方法可能包含以下程式碼:

if (DateTime.Now.Date > processDate)
{
    // Do some processing
}

程式碼直接依賴於當前日期。這種方法很難測試,因為當前日期不容易操作。使程式碼更易於測試的一種方法是刪除對當前日期的直接引用,而是將當前日期提供(或注入)到執行處理的方法。通過使用測試雙精度來簡化單元測試的設定步驟,這種依賴注入可以更容易地測試程式碼的各個方面。

IOC 系統

另一個需要考慮的方面是依賴關係的生命週期; 在類本身建立自己的依賴項(也稱為不變數)的情況下,它負責處理它們。依賴注入將此反轉(這就是為什麼我們經常將注入庫稱為控制反轉系統)並且意味著不是類負責建立,管理和清理其依賴項,而是外部代理(在此例如,IoC 系統)代替它。

這使得在同一個類的例項之間共享依賴關係變得更加簡單; 例如,考慮一個從 HTTP 端點獲取資料以供類使用的服務。由於此服務是無狀態的(即它沒有任何內部狀態),因此我們在整個應用程式中只需要一個這樣的服務例項。雖然可以(例如,通過使用靜態類)手動執行此操作,但建立類並告訴 IoC 系統將其建立為 Singleton 更簡單,其中每個類只存在一個例項。

另一個例子是 Web 應用程式中使用的資料庫上下文,其中每個請求(或執行緒)需要一個新的 Context,而不是每個控制器的例項; 這允許在該執行緒執行的每個層中注入上下文,而不必手動傳遞。

這使得消費類不必管理依賴項。