为何使用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ê
相关产品推荐
相关产品推荐

