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 Copilot con Azure Cosmos DB
.NET Conference Italia 2024
Utilizzare gRPC su App Service di Azure
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Estrarre dati randomici da una lista di oggetti in C#
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Recuperare l'ultima versione di una release di GitHub
Ottimizzare le performance usando Span<T> e il metodo Split
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Gestire gli accessi con Token su Azure Container Registry