Una novità del motore di Dependency Injection di ASP.NET Core 8 è costituita dai cosiddetti KeyedServices: grazie a essi, possiamo registrare diverse implementazioni della stessa interfaccia dietro una chiave, così da poterne iniettare una versione specifica quando serve.
Per esempio, immaginiamo di avere due implementazioni di IForecastService:
public interface IForecastProvider { IEnumerable<WeatherForecast> GetForecasts(); } public class ForecastProvider : IForecastProvider { public IEnumerable<WeatherForecast> GetForecasts() { // altro codice qui .. } } public class AlwaysSunnyForecastProvider : IForecastProvider { public IEnumerable<WeatherForecast> GetForecasts() { // altro codice qui, ma sempre 25 gradi con il sole :) } }
Possiamo registrare i due servizi come segue:
builder.Services.AddTransient<IForecastProvider, ForecastProvider>(); builder.Services.AddKeyedTransient<IForecastProvider, AlwaysSunnyForecastProvider>("sunny");
Nel secondo caso, abbiamo utilizzato il nuovo metodo AddKeyedTransient, che accetta una chiave (di tipo object) tramite cui potremo selezionare questa particolare versione di IForecastProvider.
A questo punto, quando iniettiamo il servizio, non ci resta che utilizzare l'attributo FromKeyedServices per selezionarla:
public class WeatherForecastController : ControllerBase { private IForecastProvider _provider; public WeatherForecastController(IForecastProvider provider) { _provider = provider; } [HttpGet] public IEnumerable<WeatherForecast> Get() { return _provider.GetForecasts(); } [HttpGet("sunny")] public IEnumerable<WeatherForecast> GetSunny([FromKeyedServices("sunny")] IForecastProvider provider) { return provider.GetForecasts(); } }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Selettore CSS :has() e i suoi casi d'uso avanzati
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Gestione degli stili CSS con le regole @layer
Proteggere le risorse Azure con private link e private endpoints
Eseguire query in contemporanea con EF
Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Fissare una versione dell'agent nelle pipeline di Azure DevOps
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Usare il colore CSS per migliorare lo stile della pagina
Configurare lo startup di applicazioni server e client con .NET Aspire