一、环境
.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