Usiadłem do swojego projektu w którym API ma wykonywać cyklicznie jakąś pracę. W .Net 5-6 możemy zarejestrować serwisy które dziedziczą po BackgroundService
lub IHostedService
, oba funkcjonują jako singletony.
I wróciłem ponownie do problemu wstrzykiwania Scoped do Singletona. Od którejś wersji .Net rzuca to wyjątkiem.
Długi czas temu problem ten rozwiązałem za pomocą IServiceProvider.CreateScope()
.
Teraz chwilę pogooglałem i trafiem na podobny przykład: https://cezarywalenciuk.pl/blog/programing/backgroundservice-w-aspnet-core-i-cykl-zycia-scoped
using (var scope = Services.CreateScope())
{
var scopedProcessingServices =
scope.ServiceProvider
.GetServices<IScopedProcessingService>();
for (int i = 0; i < 10; i++)
{
foreach (var scopedProcessingService in scopedProcessingServices)
{
await scopedProcessingService.DoWork(stoppingToken);
}
await Task.Delay(1000);
}
}
-
Zastanawiam się czy jest elegantsze rozwiązanie tego problemu?
-
Zastanawiam się też czy jeśli
IScopedProcessingService
jest wykorzystywane jedynie przez singletona, czy i w jakim wypadku jest sens rejestrować go jakoScoped
?