當前位置: 妍妍網 > 碼農

C# 依賴註入(DI)技術詳解

2024-05-20碼農

依賴註入(Dependency Injection,簡稱DI)是一種實作控制反轉(Inversion of Control,簡稱IoC)的設計模式。在C#中,依賴註入被廣泛套用於解耦程式碼、提高程式的可測試性和可維護性。本文將詳細探討C#中的依賴註入技術,包括其核心概念、使用場景以及如何在.NET Core和.NET 5/6等框架中實作依賴註入。

一、依賴註入的核心概念

依賴註入的核心思想是將一個物件所依賴的物件或內容以某種方式「註入」到物件中,而不是讓物件自己去建立或尋找這些依賴。這樣做的好處是降低了程式碼之間的耦合度,使得程式碼更加靈活、可重用和可測試。

在C#中,依賴註入通常透過建構函式註入、內容註入或介面註入等方式實作。其中,建構函式註入是最常用的一種方式,它將依賴作為建構函式的參數傳遞給物件。

二、依賴註入的使用場景

依賴註入在以下場景中特別有用:

  1. 單元測試 :透過註入模擬物件(Mock Object),可以輕松地測試目標物件的功能,而無需依賴真實的環境或外部系統。

  2. 解耦程式碼 :透過將依賴關系外部化,可以減少類之間的直接依賴,從而提高程式碼的可維護性和可延伸性。

  3. 外掛程式式架構 :在需要支持外掛程式式擴充套件的應用程式中,依賴註入可以幫助動態地載入和解除安裝外掛程式。

  4. 配置靈活性 :透過配置檔或環境變量等方式動態地註入依賴,可以提高應用程式的配置靈活性。

三、在.NET Core和.NET 5/6中實作依賴註入

在.NET Core和.NET 5/6等框架中,依賴註入被內建為框架的一部份。下面是一個簡單的範例,展示如何在這些框架中使用依賴註入:

  1. 定義服務介面和實作

首先,我們定義一個服務介面及其實作:

publicinterfaceIGreetingService
{
stringGreet(string name);
}
public classGreetingService : IGreetingService
{
publicstringGreet(string name)
{
return$"Hello, {name}!";
}
}

  1. 在Startup類中配置依賴註入

在.NET Core或.NET 5/6的Web應用程式中,我們可以在 Startup 類的 ConfigureServices 方法中配置依賴註入:

publicvoidConfigureServices(IServiceCollection services)
{
services.AddScoped<IGreetingService, GreetingService>();
// 其他服務配置...
}

這裏使用 AddScoped 方法將 IGreetingService 介面與 GreetingService 實作類進行繫結,並指定其生命周期為「作用域」(Scoped)。這意味著在每個HTTP請求範圍內,將共享同一個 GreetingService 例項。

  1. 在控制器中使用註入的服務

現在,我們可以在控制器中透過建構函式註入的方式使用 IGreetingService

[ApiController]
[Route("[controller]")]
public classGreetingController : ControllerBase
{
privatereadonly IGreetingService _greetingService;
publicGreetingController(IGreetingService greetingService)
{
_greetingService = greetingService;
}
[HttpGet("{name}")]
public IActionResult Greet(string name)
{
string greeting = _greetingService.Greet(name);
return Ok(greeting);
}
}

在這個例子中,當 GreetingController 被例項化時,框架會自動將 IGreetingService 的實作註入到其建構函式中。這樣,我們就可以在控制器中使用這個服務了。

四、總結

依賴註入是C#中一種重要的設計模式,它可以幫助我們解耦程式碼、提高程式的可測試性和可維護性。在.NET Core和.NET 5/6等框架中,依賴註入被內建為框架的一部份,使得我們可以更加方便地使用這種設計模式。透過合理地使用依賴註入,我們可以構建出更加靈活、可延伸和可測試的C#應用程式。