Устранение ошибки внедрения зависимостей в фоновой задаче API .NET 5 ⇐ C#
Устранение ошибки внедрения зависимостей в фоновой задаче API .NET 5
Основная цель — перезагрузка данных учетной записи пользователя через регулярные 30-минутные интервалы в API .NET 5. Преследуя эту цель, я узнал кое-что о реализации фоновых задач для автоматизации этого процесса. Следуя руководству, я попытался настроить фоновую задачу, также имеющую scopedService. Однако в ходе реализации я столкнулся с постоянными ошибками:
1.
«Служба для типа «AccountRepository.AccountScopedService» не зарегистрирована».
Несмотря на многочисленные попытки устранения неполадок, включая проверку регистрации службы, проверку внедрения зависимостей и повторный просмотр видео, ошибка остается неустраненной.
[*]Если я отменю последний шаг видео и просто использую IAccountSingletonService singletonService, IAccountTransientService transientService в ctor (то есть без IServiceProvider serviceProvider), приложение зависает. Swagger не загружен.
Я ценю вашу помощь.
AccountLoaderBackgroundService.cs
с использованием системы; использование System.Collections.Generic; использование System.Threading; использование System.Threading.Tasks; использование Microsoft.Extensions.DependencyInjection; использование Microsoft.Extensions.Hosting; пространство имен AccountRepository { общедоступный класс AccountLoaderBackgroundService: BackgroundService { общедоступный только для чтения List AllPersons = новый List(); частный только для чтения IServiceProvider _serviceProvider; частный только для чтения IAccountSingletonService SingletonService; частный только для чтения IAcountTransientService transientService; public AccountLoaderBackgroundService (IAccountSingletonService singletonService, IAcountTransientService transientService, поставщик услуг IServiceProvider) { _serviceProvider = поставщик услуг; } защищенное переопределение асинхронной задачи ExecuteAsync (CancellationToken StopToken) { в то время как (!stoppingToken.IsCancellationRequested) { используя (область var = _serviceProvider.CreateScope()) { varscopedService =scope.ServiceProvider.GetRequiredService(); ЗагрузитьСчета(); System.Diagnostics.Debug.WriteLine("ExecuteAsync в AccountLoaderBackgroundService"); ждут Task.Delay(new TimeSpan(0, 30, 0)); } } } общедоступный логический LoadAccounts() { // считываем данные вернуть истину; } } } AccountLoaderHostedService.cs
с использованием Microsoft.Extensions.Hosting; использование системы; использование System.Threading; использование System.Threading.Tasks; пространство имен AccountRepository { общедоступный класс AccountLoaderHostedService: IHostedService { общедоступная асинхронная задача StartAsync (CancellationToken cancelToken) { в то время как (!cancellationToken.IsCancellationRequested) { System.Diagnostics.Debug.WriteLine("StartAsync в AccountLoaderHostedService"); ждут Task.Delay(new TimeSpan(0, 30, 0)); } } общедоступная задача StopAsync (CancellationToken cancelToken) { вернуть Задача.ЗавершеннаяЗадача; } } } Startup.cs
services.AddSingleton(); Services.AddScoped(); Services.AddTransient(); Services.AddHostedService(); Services.AddHostedService(); Кроме того, я написал классы и интерфейсы для трёх сервисов.
публичный класс AccountScopedService: IAccountScopedService { } общедоступный класс AccountSingletonService: IAccountSingletonService { } общедоступный класс AcountTransientService: IAcountTransientService { } общедоступный интерфейс IAccountScopedService { } общедоступный интерфейс IAccountSingletonService { } общедоступный интерфейс IAcountTransientService { }
Основная цель — перезагрузка данных учетной записи пользователя через регулярные 30-минутные интервалы в API .NET 5. Преследуя эту цель, я узнал кое-что о реализации фоновых задач для автоматизации этого процесса. Следуя руководству, я попытался настроить фоновую задачу, также имеющую scopedService. Однако в ходе реализации я столкнулся с постоянными ошибками:
1.
«Служба для типа «AccountRepository.AccountScopedService» не зарегистрирована».
Несмотря на многочисленные попытки устранения неполадок, включая проверку регистрации службы, проверку внедрения зависимостей и повторный просмотр видео, ошибка остается неустраненной.
[*]Если я отменю последний шаг видео и просто использую IAccountSingletonService singletonService, IAccountTransientService transientService в ctor (то есть без IServiceProvider serviceProvider), приложение зависает. Swagger не загружен.
Я ценю вашу помощь.
AccountLoaderBackgroundService.cs
с использованием системы; использование System.Collections.Generic; использование System.Threading; использование System.Threading.Tasks; использование Microsoft.Extensions.DependencyInjection; использование Microsoft.Extensions.Hosting; пространство имен AccountRepository { общедоступный класс AccountLoaderBackgroundService: BackgroundService { общедоступный только для чтения List AllPersons = новый List(); частный только для чтения IServiceProvider _serviceProvider; частный только для чтения IAccountSingletonService SingletonService; частный только для чтения IAcountTransientService transientService; public AccountLoaderBackgroundService (IAccountSingletonService singletonService, IAcountTransientService transientService, поставщик услуг IServiceProvider) { _serviceProvider = поставщик услуг; } защищенное переопределение асинхронной задачи ExecuteAsync (CancellationToken StopToken) { в то время как (!stoppingToken.IsCancellationRequested) { используя (область var = _serviceProvider.CreateScope()) { varscopedService =scope.ServiceProvider.GetRequiredService(); ЗагрузитьСчета(); System.Diagnostics.Debug.WriteLine("ExecuteAsync в AccountLoaderBackgroundService"); ждут Task.Delay(new TimeSpan(0, 30, 0)); } } } общедоступный логический LoadAccounts() { // считываем данные вернуть истину; } } } AccountLoaderHostedService.cs
с использованием Microsoft.Extensions.Hosting; использование системы; использование System.Threading; использование System.Threading.Tasks; пространство имен AccountRepository { общедоступный класс AccountLoaderHostedService: IHostedService { общедоступная асинхронная задача StartAsync (CancellationToken cancelToken) { в то время как (!cancellationToken.IsCancellationRequested) { System.Diagnostics.Debug.WriteLine("StartAsync в AccountLoaderHostedService"); ждут Task.Delay(new TimeSpan(0, 30, 0)); } } общедоступная задача StopAsync (CancellationToken cancelToken) { вернуть Задача.ЗавершеннаяЗадача; } } } Startup.cs
services.AddSingleton(); Services.AddScoped(); Services.AddTransient(); Services.AddHostedService(); Services.AddHostedService(); Кроме того, я написал классы и интерфейсы для трёх сервисов.
публичный класс AccountScopedService: IAccountScopedService { } общедоступный класс AccountSingletonService: IAccountSingletonService { } общедоступный класс AcountTransientService: IAcountTransientService { } общедоступный интерфейс IAccountScopedService { } общедоступный интерфейс IAccountSingletonService { } общедоступный интерфейс IAcountTransientService { }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение