Il motore di dependency injection di ASP.NET Core presenta molte funzionalità che, alle volte, non sono di così evidente utilizzo. Un esempio pratico è dato dalla possibilità di registrare servizi generici.
Con ogni probabilità avremo usato decine di volte l'interfaccia ILogger<T> nei nostri controller:
public HomeController(ILogger<HomeController> logger) { _logger = logger; }
Questo è un tipico esempio in cui il tipo registrato come servizio sia un cosiddetto open generic, in cui cioé non specifichiamo il parametro generico in fase di configurazione dell'IoC container, ma solo quando andiamo effettivamente a utilizzarlo.
Immaginiamo allora di aver creato, nella nostra infrastruttura di servizi applicativi, una generica interfaccia IRepository
public interface IRepository<TEntity> { Task<TEntity> GetById(int id); // .. altro codice qui .. } internal class Repository<TEntity> : IRepository<TEntity> { public Task<TEntity> GetById(int id) { ... } }
All'interno della classe Startup potremo configurare questo servizio usando il seguente overload di services.AddTransient:
public void ConfigureServices(IServiceCollection services) { // .. altro codice qui .. services.AddTransient(typeof(IRepository<>), typeof(Repository<>)); }
In questo modo, potremo specificare il parametro generico direttamente nel controller, al momento in cui iniettiamo l'istanza:
public PeopleController(IRepository<Person> people, IRepository<City> cities) { _people = people; _cities = cities; }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Creare automaticamente una relazione padre-figlio tra work item in Azure DevOps
Blazor: Security
Effettuare l'upload di un file da Blazor su Azure Blob Storage
Usare i Top Level statement in C#
Chiamare API WinRT da applicazioni .NET 5
disponibile #net5 RC1, con #CSharp9, #aspnet5, #efcore5 e licenza go live https://aspit.co/b2m
Cercare del testo con Azure Cosmos DB SQL
Gestire un observable quando la finestra del browser non è attiva in Angular
Rinominare tabelle e colonne durante il reverse engineering con EF Core Power Tools
Modificare la modalità di esecuzione delle query con Include in Entity Framework Core 5
Single Page Application con .NET 5
Paginare un elenco con Blazor Server