依賴是另一個物件所依賴的物件。依賴注入(或反轉)基本上是提供對象所需的對象,而不是讓它自己建構對象。這是一種有用的技術,可以使測試變得更容易,因為它允許您模擬依賴關係。
例如,如果類別 A 呼叫類別 B 上的方法,而類別 B 又呼叫類別 C 上的方法,則表示A依賴B,B依賴C。使用依賴注入,我們可以將類別C的實例傳遞給類別B,並將B的實例傳遞給類別A,而不是讓這些類別建構B和C的實例.
在下面的範例中,類別Runner 依賴類別Logger。請注意,在類別 Runner 的建構函式中建立了 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
以上是解釋C#中的依賴注入的詳細內容。更多資訊請關注PHP中文網其他相關文章!