You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:12:15