Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.UserManager` from root provider

#c_sharp #aspnet_core #dependency_injection #aspnet_core_2


У меня есть сервис в проекте ASP.NET Core 2.0

public class SomeSingletonService: IUserGetPropertiesService
{
   private readonly IServiceProvider _serviceProvider;

   public SomeSingletonService(IServiceProvider serviceProvider)
   {
      _serviceProvider = serviceProvider;
   }

   public void SomeFunction() {
       // в этой строчке падает с ошибкой
       UserManager userManager = _serviceProvider.GetService>();
       // ...
   }
}


Сервис регистрируется как Singleton

services.AddSingleton();


При попытке получить UserManager из _serviceProvider падает с ошибкой


  {System.InvalidOperationException: Cannot resolve scoped service
  'Microsoft.AspNetCore.Identity.UserManager`1[MyProject.Models.User]'
  from root provider.


Не могу понять в чём дело, ведь в SomeFunction по идее можно получать scoped сервисы.
Как мне в SomeFunction прокинуть UserManager?

Не хочется ей передавать его в параметрах, так как тогда пришлось бы через всю логику
приложения носить этот UserManager, тогда как по идее можно его извлекать из
Dependance Injection Container, который я пробую передать через конструктор - IServiceProvider
serviceProvider
    


Ответы

Ответ 1



Выяснилось что Scoped сервисы нужно получать через специальный блок using (var serviceScope = _serviceProvider.GetRequiredService() .CreateScope()) { UserManager userManager = serviceScope.ServiceProvider.GetService>(); }

Ответ 2



Другое решение — отключить проверку областей видимости для сервисов, поставляемых средством DI. Это делается в Program.cs, найдите место создания IWebHostBuilder и добавьте: WebHost.CreateDefaultBuilder(args) .UseStartup() .UseDefaultServiceProvider(options => options.ValidateScopes = false); // <==

Комментариев нет:

Отправить комментарий