C#依賴(lài)注入如何配置管理

c#
小樊
81
2024-10-25 19:15:48

在C#中,依賴(lài)注入(Dependency Injection,DI)是一種設(shè)計(jì)模式,用于降低代碼之間的耦合度,提高代碼的可維護(hù)性和可測(cè)試性。在C#中,我們可以使用Microsoft.Extensions.DependencyInjection庫(kù)來(lái)實(shí)現(xiàn)依賴(lài)注入的配置和管理。以下是一些基本步驟:

  1. 安裝依賴(lài)注入庫(kù): 使用NuGet包管理器安裝Microsoft.Extensions.DependencyInjection庫(kù)。在Visual Studio中,可以通過(guò)NuGet包管理器控制臺(tái)執(zhí)行以下命令來(lái)安裝:
Install-Package Microsoft.Extensions.DependencyInjection
  1. 定義服務(wù)接口和實(shí)現(xiàn)類(lèi): 首先,定義一個(gè)服務(wù)接口,然后創(chuàng)建一個(gè)實(shí)現(xiàn)該接口的類(lèi)。例如,定義一個(gè)IMyService接口和一個(gè)實(shí)現(xiàn)該接口的MyServiceImpl類(lèi):
public interface IMyService
{
    string DoWork();
}

public class MyServiceImpl : IMyService
{
    public string DoWork()
    {
        return "Hello from MyServiceImpl!";
    }
}
  1. 配置依賴(lài)注入容器: 在應(yīng)用程序的啟動(dòng)代碼中(例如在Program.cs文件中),創(chuàng)建一個(gè)ServiceCollection實(shí)例,并將服務(wù)實(shí)現(xiàn)類(lèi)注冊(cè)到該集合中。然后,使用ServiceProvider實(shí)例來(lái)解析依賴(lài)關(guān)系:
using Microsoft.Extensions.DependencyInjection;

class Program
{
    static void Main(string[] args)
    {
        // 創(chuàng)建服務(wù)收集器
        var services = new ServiceCollection();

        // 注冊(cè)服務(wù)實(shí)現(xiàn)類(lèi)
        services.AddTransient<IMyService, MyServiceImpl>();

        // 創(chuàng)建服務(wù)提供者并解析依賴(lài)關(guān)系
        var serviceProvider = services.BuildServiceProvider();
        var myService = serviceProvider.GetService<IMyService>();

        // 使用服務(wù)
        var result = myService.DoWork();
        Console.WriteLine(result);
    }
}

在上面的示例中,我們使用AddTransient方法將MyServiceImpl類(lèi)注冊(cè)為IMyService接口的瞬態(tài)(transient)依賴(lài)項(xiàng)。這意味著每次請(qǐng)求IMyService接口時(shí),都會(huì)創(chuàng)建一個(gè)新的MyServiceImpl實(shí)例。

你還可以使用其他生命周期管理選項(xiàng),例如單例(singleton)或上下文(context-based)生命周期。例如,使用AddSingleton方法將MyServiceImpl類(lèi)注冊(cè)為單例依賴(lài)項(xiàng):

services.AddSingleton<IMyService, MyServiceImpl>();

這將導(dǎo)致在整個(gè)應(yīng)用程序的生命周期中只創(chuàng)建一個(gè)MyServiceImpl實(shí)例。

  1. 使用依賴(lài)注入容器: 在應(yīng)用程序的其他部分,你可以通過(guò)依賴(lài)注入容器來(lái)解析依賴(lài)關(guān)系。例如,在一個(gè)控制器中,你可以將IMyService接口作為構(gòu)造函數(shù)參數(shù)傳遞:
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);
    }
}

通過(guò)這種方式,你可以確保MyController始終使用相同的IMyService實(shí)例,從而降低了代碼之間的耦合度。

0