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
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Gestione dell'annidamento delle regole dei layer in CSS
Gestire gli accessi con Token su Azure Container Registry
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Creare una libreria CSS universale - Rotazione degli elementi
Utilizzare i variable font nel CSS
Utilizzare l nesting nativo dei CSS
Gestione file Javascript in Blazor con .NET 9
Managed deployment strategy in Azure DevOps
Loggare le query più lente con Entity Framework
Ottimizzare le pull con Artifact Cache di Azure Container Registry
Simulare Azure Cosmos DB in locale con Docker