1. 程式人生 > 實用技巧 >Cannot resolve scoped service from root provider

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