#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); // <==
Комментариев нет:
Отправить комментарий