in ASPNET Core, C#

Hosted Service e Dependency Injection

Gli HostedService sono aggiunti al flusso della DI di un applicazione ..NET Core come Singleton. Questo tipo di registrazione ha come risultato che a livello di injection è possibile risolvere soltanto Singleton e Transient. Nel caso in cui si cerchi di effettuare la risoluzione di un oggetto registrato come Scoped, verrà generato un errore a runtime al momento dell’avvio del service in background.

E’ comunque possibile effettuare la risoluzione di uno Scoped iniettando IServiceProvider, che consente di effettuare la creazione di un’istanza Scoped mediante il metodo CreateScope . In questo modo è possibile utilizzare un’istanza Scoped come se fosse stata iniettata direttamente nel costruttore:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
 
namespace ServiceExample
{
    public class MyService : BackgroundService
    {
        private readonly IServiceProvider _serviceProvider;
        public MyBackgroundService(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
 
        protected override async Task ExecuteAsync(CancellationToken cancellationToken)
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                using (var scope = _serviceProvider.CreateScope())
                {
                    var scopedService = scope.ServiceProvider.GetRequiredService<IScopedService>();
                }
 
                await Task.Delay(new TimeSpan(0, 1, 0));
            }
        }
    }
}

In un prossimo post verrà analizzato come passare parametri all’interno di un HostedService, come ad esempio parametri di configurazione.