#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() { // в этой строчке падает с ошибкой UserManageruserManager = _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); // <==
Комментариев нет:
Отправить комментарий