在 ASP.NET Core 中,IServiceProvider
是依赖注入的核心接口,用于解析服务实例。可以通过多种方式获取 IServiceProvider
,但每种方式的适用场景和行为可能有所不同。下面将详细介绍几种常见的获取方式,并分析它们之间的区别。
//1. 定义服务接口和实现类
public interface IDateTime
{
DateTime Now { get; }
}
public class SystemDateTime : IDateTime
{
public DateTime Now => DateTime.Now;
}
//2.注入服务
builder.Services.AddSingleton<IDateTime, SystemDateTime>();
var app = builder.Build();
//Net分享,欢迎关注!
这是最常见的方式之一,适用于需要在整个类中使用 IServiceProvider
的场景。
public classWeatherForecastController : ControllerBase
{
privatereadonly IServiceProvider _serviceProvider;
public WeatherForecastController(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
[HttpGet(Name = "GetWeatherForecast")]
public bool Get()
{
var service = _serviceProvider.GetService<IDateTime>();
// 使用服务
Console.WriteLine( "NetShare:"+service.Now);
returntrue;
}
}
特点:
IServiceProvider
的过度依赖(即服务定位器模式),破坏显式依赖声明的原则。HttpContext.RequestServices
在控制器或中间件中,可以通过 HttpContext.RequestServices
获取当前请求作用域内的 IServiceProvider
。
public classWeatherForecastController : ControllerBase
{
privatereadonly IHttpContextAccessor _httpContextAccessor;
public WeatherForecastController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
[HttpGet(Name = "GetWeatherForecast")]
public bool Get()
{
var serviceProvider = _httpContextAccessor.HttpContext.RequestServices;
var service = serviceProvider.GetService<IDateTime>();
// 使用服务
Console.WriteLine("NetShare:" + service.Now);
returntrue;
}
}
特点:
IHttpContextAccessor
,增加了间接依赖。//需要注册
builder.Services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
IServiceScopeFactory
如果需要手动创建作用域并获取服务,可以使用 IServiceScopeFactory
。
public classWeatherForecastController : ControllerBase
{
privatereadonly IServiceScopeFactory _scopeFactory;
public WeatherForecastController(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
[HttpGet(Name = "GetWeatherForecast")]
public bool Get()
{
using (var scope = _scopeFactory.CreateScope())
{
var serviceProvider = scope.ServiceProvider;
var service = serviceProvider.GetService<IDateTime>();
// 使用服务
Console.WriteLine("NetShare:" + service.Now);
}
returntrue;
}
}
特点:
WebApplication
WebApplication
是应用启动时创建的全局 IServiceProvider
,通常用于获取单例服务。
builder.Services.AddSingleton<IDateTime, SystemDateTime>();
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
//Net分享,欢迎关注!
var myService = scope.ServiceProvider.GetRequiredService<IDateTime>();
// 使用服务
Console.WriteLine("NetShare:" + myService.Now);
}
特点:
方式 | 适用场景 | 是否支持请求作用域 | 生命周期管理 |
---|---|---|---|
构造函数注入 | 普通类中使用 | 否 | 外部管理 |
HttpContext.RequestServices | HTTP 请求上下文中使用 | 是 | 自动管理 |
WebApplication | 应用启动时或全局范围内使用 | 否 | 全局单例 |
IServiceScopeFactory | 需要手动创建作用域的场景 | 是 | 需要手动管理 |
IServiceProvider
动态获取服务。这有助于提高代码的可读性和可维护性。IServiceScopeFactory
创建作用域,请确保及时释放资源,避免内存泄漏。HttpContext.RequestServices
,因为它可能与当前线程无关。扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有