解釋 C# 中的依賴注入
依賴項是另一個物件所依賴的物件。依賴注入(或反轉)基本上是提供物件所需的物件,而不是讓它自己構造這些物件。這是一種有用的技術,可以使測試更容易,因為它允許你模擬依賴項。
例如,如果類 A 呼叫類 B 上的方法,而類 B 又呼叫類 C 上的方法,則意味著 A 依賴於 B,而 B 依賴於 C。使用依賴注入,我們可以將類 C 的例項傳遞給類 B,並將 B 的例項傳遞給類 A,而不是讓這些類構造 B 和 C 的例項。
在下面的示例中,類 Runner 依賴於類 Logger。請注意,在類 Runner 中,在建構函式中建立了一個 Logger 的例項。這段程式碼存在一些問題。
這將 Logger 類繫結到 Runner,並且我們無法用其他類替換它,而無需修改 Runner。
如果 Logger 有任何依賴項,則 Worker 必須在例項化 Logger 之前配置它們。
測試更難。如果 Logger 是一個資源密集型類,例如訪問網路或檔案系統,它會降低測試速度。我們無法輕鬆地替換它。
using System; class Program{ static void Main(string[] args){ var runner = new Runner(); runner.Run(); } } class Runner{ private Logger _logger; public Runner(){ _logger = new Logger(); } public void Run(){ // Do some work _logger.Log("Message to be logged"); } } class Logger{ public void Log(string message){ Console.WriteLine(message); } }
使用依賴注入,我們將 Runner 的建構函式修改為接受一個介面 ILogger,而不是一個具體的物件。我們將 Logger 類更改為實現 ILogger。這使我們可以將 Logger 類的例項傳遞給 Runner 的建構函式。這樣做的好處是,在測試期間,我們可以建立一個實現 ILogger 的 TestLogger 類,並將其傳遞給 Runner 的建構函式。
示例
using System; class Program{ static void Main(string[] args){ var logger = new Logger(); var runner = new Runner(logger); runner.Run(); } } class Runner{ private ILogger _logger; public Runner(ILogger logger){ _logger = logger; } public void Run(){ // Do some work _logger.Log("Message to be logged"); } } interface ILogger{ void Log(string message); } class Logger : ILogger{ public void Log(string message){ Console.WriteLine(message); } }
輸出
Message to be logged
廣告