Cannot resolve scoped service from root provider

一、环境

.NET Core 3.1,在Singleton生命周期的类中引用了Scoped生命周期的类,报错Cannot resolve scoped service from root provider。

 1     /// <summary>
 2     /// 单例模式
 3     /// </summary>
 4     public class Test
 5     {
 6         private readonly IUserService _userService;//Scoped模式
 7         public Test(IUserService userService)
 8         {
 9             10             11             _userService = userService;
12         }
13     }

二、解决过程

1、在Program.cs里将禁用验证Scope的服务是否被错误使用。

1 public static IHostBuilder CreateHostBuilder(string[] args) =>
2             Host.CreateDefaultBuilder(args)
3                 .ConfigureWebHostDefaults(webBuilder =>
4                 {
5                     webBuilder.UseStartup<Startup>();
6                 }).UseDefaultServiceProvider(options =>
7                 {
8                     options.ValidateScopes = false;
9                 });

这样解决的话算是不承认自己错了呗!

2、从IApplicationBuilder中获取IUserService

 1     /// <summary>
 2     /// 单例模式
 3     /// </summary>
 4     public class Test
 5     {
 6         private readonly IUserService _userService;
 7 
 8         public Test(IApplicationBuilder app)
 9         {
10             var scope = app.ApplicationServices.CreateScope();
11             _userService = scope.ServiceProvider.GetRequiredService<IUserService>();
12         }
13     }    

三、说明

一般情况下,生命周期较长的服务不应该依赖一个生命周期较短的服务,Scope的服务被Singleton的服务依赖/引用,那么这个Scope的服务也会随依赖它的Singleton服务变成Singleton的。

四、参考资料

https://my.oschina.net/u/4401036/blog/3713739

 

posted @ 2020-12-14 11:31  刘泽岐  阅读(2330)  评论(0编辑  收藏  举报