C#依赖注入如何配置管理

avatar
作者
猴君
阅读量:0

在C#中,依赖注入(Dependency Injection,DI)是一种设计模式,用于降低代码之间的耦合度,提高代码的可维护性和可测试性。在C#中,我们可以使用Microsoft.Extensions.DependencyInjection库来实现依赖注入的配置和管理。以下是一些基本步骤:

  1. 安装依赖注入库: 使用NuGet包管理器安装Microsoft.Extensions.DependencyInjection库。在Visual Studio中,可以通过NuGet包管理器控制台执行以下命令来安装:
Install-Package Microsoft.Extensions.DependencyInjection 
  1. 定义服务接口和实现类: 首先,定义一个服务接口,然后创建一个实现该接口的类。例如,定义一个IMyService接口和一个实现该接口的MyServiceImpl类:
public interface IMyService {     string DoWork(); }  public class MyServiceImpl : IMyService {     public string DoWork()     {         return "Hello from MyServiceImpl!";     } } 
  1. 配置依赖注入容器: 在应用程序的启动代码中(例如在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实例。

  1. 使用依赖注入容器: 在应用程序的其他部分,你可以通过依赖注入容器来解析依赖关系。例如,在一个控制器中,你可以将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实例,从而降低了代码之间的耦合度。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!