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 gRPC su App Service di Azure
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Implementare l'infinite scroll con QuickGrid in Blazor Server
Usare un KeyedService di default in ASP.NET Core 8
Gestire liste di tipi semplici con Entity Framework Core
Creare alias per tipi generici e tuple in C#
Utilizzare il trigger SQL con le Azure Function
Code scanning e advanced security con Azure DevOps
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT