在C#中,依賴注入(Dependency Injection,DI)是一種設計模式,用于降低代碼之間的耦合度,提高代碼的可維護性和可測試性。在C#中,我們可以使用Microsoft.Extensions.DependencyInjection庫來實現依賴注入的配置和管理。以下是一些基本步驟:
Install-Package Microsoft.Extensions.DependencyInjection
IMyService
接口和一個實現該接口的MyServiceImpl
類:public interface IMyService
{
string DoWork();
}
public class MyServiceImpl : IMyService
{
public string DoWork()
{
return "Hello from MyServiceImpl!";
}
}
Program.cs
文件中),創建一個ServiceCollection
實例,并將服務實現類注冊到該集合中。然后,使用ServiceProvider
實例來解析依賴關系:using Microsoft.Extensions.DependencyInjection;
class Program
{
static void Main(string[] args)
{
// 創建服務收集器
var services = new ServiceCollection();
// 注冊服務實現類
services.AddTransient<IMyService, MyServiceImpl>();
// 創建服務提供者并解析依賴關系
var serviceProvider = services.BuildServiceProvider();
var myService = serviceProvider.GetService<IMyService>();
// 使用服務
var result = myService.DoWork();
Console.WriteLine(result);
}
}
在上面的示例中,我們使用AddTransient
方法將MyServiceImpl
類注冊為IMyService
接口的瞬態(transient)依賴項。這意味著每次請求IMyService
接口時,都會創建一個新的MyServiceImpl
實例。
你還可以使用其他生命周期管理選項,例如單例(singleton)或上下文(context-based)生命周期。例如,使用AddSingleton
方法將MyServiceImpl
類注冊為單例依賴項:
services.AddSingleton<IMyService, MyServiceImpl>();
這將導致在整個應用程序的生命周期中只創建一個MyServiceImpl
實例。
IMyService
接口作為構造函數參數傳遞:using Microsoft.AspNetCore.Mvc;
[Route("api/[controller]")]
[ApiController]
public class MyController : ControllerBase
{
private readonly IMyService _myService;
public MyController(IMyService myService)
{
_myService = myService;
}
[HttpGet]
public ActionResult<string> Get()
{
var result = _myService.DoWork();
return Ok(result);
}
}
通過這種方式,你可以確保MyController
始終使用相同的IMyService
實例,從而降低了代碼之間的耦合度。