ASP.NET Core 6中注入的IServiceProvider是否为当前请求作用域容器?
关于ASP.NET Core 6中注入IServiceProvider的作用域疑问
问题描述
在ASP.NET Core 6应用中,我通过以下代码将IServiceProvider注册为作用域服务:
services.AddScoped(sp => sp);
我想确认:这个注入的容器是不是当前请求的作用域容器?能不能保证它提供的依赖实例,和请求中其他地方注入的同作用域实例是同一个?
背景补充
启动时我会把方法边界回调注册到服务集合里,选择注入服务提供者而非直接注入回调,主要有两个原因:
- 打破潜在的循环依赖
- 避免仅调用单个方法时就实例化所有回调
解答
是的,你通过services.AddScoped(sp => sp)注册的IServiceProvider,就是当前请求对应的作用域服务提供者,完全能保证它提供的同作用域依赖实例,和请求中其他地方注入的实例一致。
原因很简单:在ASP.NET Core的DI系统中,当注册作用域服务时,工厂委托sp => sp里的sp参数,本身就是当前请求作用域下的服务提供者。把它作为返回值注册为作用域服务后,每次在同一个请求作用域内注入IServiceProvider,拿到的都是这个作用域对应的实例,自然和其他地方通过DI获取的作用域服务提供者是同一个。
这种做法完全契合你的需求:
- 因为是按需通过
IServiceProvider获取回调实例,不会提前实例化所有回调,避免了不必要的资源消耗 - 通过注入
IServiceProvider而非直接依赖回调,确实能有效打破循环依赖的问题,这也是DI系统中常用的规避循环依赖的手段之一
内容的提问来源于stack exchange,提问作者Kevin Krumwiede
相关产品推荐
相关产品推荐

