Quando abbiamo un servizio applicativo che implementa diverse interfacce, la registrazione nella ServiceCollection di ASP.NET Core richiede un minimo di attenzione, soprattutto se vogliamo un ciclo di vita Singleton o Scoped.
Prendiamo in considerazione la seguente classe come esempio:
public class LocationService: ICityService, IRegionService { ... }
Immaginiamo ora di volerla registrare come Singleton, così che l'istanza resti la stessa per tutto il ciclo di vita dell'applicazione:
public void ConfigureServices(IServiceCollection services) { services.AddSingleton<ICityService, LocationService>(); services.AddSingleton<IRegionService, LocationService>(); }
Il codice in alto è evidentemente errato, perché abbiamo creato due entry differenti nella lista dei servizi, e il motore di DI creerà due diverse istanze:
public class MyController : ControllerBase { public MyController(ICityService cityService, IRegionService regionService) { // cityService != regionService } }
Per ovviare a questo problema, dobbiamo allora configurare i servizi nel modo seguente:
public void ConfigureServices(IServiceCollection services) { services.AddSingleton<LocationService>(); services.AddSingleton<ICityService>(s => { return s.GetService<LocationService>(); }); services.AddSingleton<IRegionService>(s => { return s.GetService<LocationService>(); }); }
In questo modo, la registrazione del servizio avverrà una sola volta, tramite la sua implementazione concreta, mentre per risolvere le interfacce ci limiteremo a recuperare lo stesso servizio tramite i due delegate che abbiamo specificato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
.NET Conference Italia 2023
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Usare le collection expression per inizializzare una lista di oggetti in C#
Miglioramenti nell'accessibilità con Angular CDK
Disabilitare automaticamente un workflow di GitHub
Eseguire operazioni sui blob con Azure Storage Actions
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Utilizzare gli snapshot con Azure File shares
Definire lo stile CSS in base alle dimensioni del container
Migrare una service connection a workload identity federation in Azure DevOps
Usare ASP.NET Core dev tunnels per testare le applicazioni su internet
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API