在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
实例,从而降低了代码之间的耦合度。