Gestire interfacce multiple nella DI di ASP.NET Core

di Marco De Sanctis, in ASP.NET Core,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi