解釋 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

更新於: 2021年5月19日

16K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告