Asp.net-Core

我們需要依賴注入的介面嗎?

  • March 28, 2017

我有一個 ASP.NET Core 應用程序。該應用程序有幾個幫助類可以做一些工作。每個類都有不同的簽名方法。我在網上看到很多 .net 核心範例,它們為每個類創建介面,然後使用 DI 框架註冊類型。例如

public interface IStorage
{
   Task Download(string file);
}

public class Storage
{
   public Task Download(string file)
   {
   }
}

public interface IOcr
{
    Task Process();
}

public class Ocr:IOcr
{
   public Task Process()
   {

   }
}

基本上每個介面只有一個類。然後我將這些類型與 DI 註冊為

services.AddScoped<IStorage, Storage>();
services.AddScoped<IOcr,Ocr>();

但是我可以在沒有介面的情況下註冊類型,所以這裡的介面看起來是多餘的。例如

services.AddScoped<Storage>();
services.AddScoped<Ocr>();

那麼我真的需要介面嗎?

不,您不需要用於依賴注入的介面。但是依賴注入對它們更有用!

正如您所注意到的,您可以使用服務集合註冊具體類型,ASP.NET Core 會將它們注入您的類中而不會出現問題。通過注入它們而不是簡單地創建實例,您獲得的好處new Storage()服務生命週期管理(瞬態 vs. 作用域 vs. 單例)。

這很有用,但只是使用 DI 的一部分功能。正如@DavidG 所指出的,介面經常與 DI 配對的主要原因是測試。使您的消費者類依賴於介面(抽象)而不是其他具體的類,使它們更容易測試。

例如,您可以創建一個在測試期間使用的MockStorage實現IStorage,而您的消費者類應該無法區分。或者,您可以使用模擬框架輕鬆地動態創建模擬IStorage。用具體的類做同樣的事情要困難得多。介面使得在不改變抽象的情況下替換實現變得容易。

引用自:https://stackoverflow.com/questions/43079277