解釋 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
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP