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

为何使用GetService()可获取Transient服务却无法获取Scoped服务?

问题解答

一、Scoped服务解析报错的原因

ASP.NET Core的服务容器分为根容器和作用域容器:

  • app.Services属于根容器,生命周期和整个应用一致;
  • Scoped服务的设计逻辑是绑定到特定作用域(比如每个HTTP请求就是一个默认作用域),每个作用域内只会生成一个实例。

根容器本身没有关联任何作用域上下文,直接从根容器解析Scoped服务时,容器无法确定该服务归属的作用域,因此抛出Cannot resolve scoped service ... from root错误。

正确的处理方式是先创建作用域,再从作用域容器中解析Scoped服务:

using var scope = app.Services.CreateScope();
var scopedService = scope.ServiceProvider.GetService<IConfigurateServices>();

二、Transient服务的实例创建时机

Transient服务不会在应用启动时创建。
服务注册阶段(比如builder.Services.AddTransient<...>)只是向容器声明“需要该服务时的实例创建规则”,并不会立即生成实例。只有当你第一次调用GetService<IConfigurateServices>(),或者该服务被注入到其他类中时,容器才会创建Transient实例,且每次解析都会生成全新的实例。


内容的提问来源于stack exchange,提问作者Khánh Toàn Lê

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:12:35