Cannot resolve scoped service from root provider
阿新 • • 發佈:2020-12-14
一、環境
.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