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
Usare le navigation property in QuickGrid di Blazor
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Configurare lo startup di applicazioni server e client con .NET Aspire
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Aggiungere interattività lato server in Blazor 8
Creare una libreria CSS universale: Immagini
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
I più letti di oggi
- Simulare Azure Cosmos DB in locale con Docker
- Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- .NET Conference Italia 2024 - Milano
- .NET Conference Italia 2023 - Milano e Online