Dependency Injection

Dependency Injection in ASP.NET Core

Nel normale workflow di un’applicazione classi e metodi richiedono esplicitamente parametri all’interno del loro costruttore o del metodo stesso.

Tecnicamente se una classe richiede che un’altra classe esegua delle operazioni, sicuramente esiste un legame di dipendenza tra di loro: si può affermare che la classe A ha una dipendenza con la classe B.

Se tali dipendenze sono presenti solo all’interno della classe e non sono indicate nella sua interfaccia pubblica, vengono definiti dipendenze implicite.

Le classi con dipendenze implicite hanno un costo maggiore in termine di manutenzione e soprattutto risulta difficile l’applicazione di procedure di test: questo perché sono fortemente dipendenti tra loro.

Le classi con dipendenze esplicite, invece, dichiarano in maniera più netta le loro dipendenze, implementando il Principle of least astonishment.

L’utilizzo di classi con dipendenze esplicite consente di realizzare implementazioni intercambiabili sia durante le fasi di test sia durante le fasi di debug.

Tutto questo consente di scrivere codice molto più mantenibile e soprattutto più reattivi ai cambiamenti.

Prima di ASP.NET Core la Dependency Injection era possibile utilizzando software di terze parti come ad esempio Autofac, Ninject, StructureMap.

In ASP.NET Core è presente un sistema integrato di DI che può essere configurata utilizzando il file Startup.ConfigureServices, all’interno del metodo ConfigureServices della classe Startup.

Al momento della registrazione, le dipendenze richiedono la definizione del loro life time.

Questa indicazione consente di definire le condizioni per le quali verrà creata una nuova istanza del servizio (classe).

Il framework permette di configurare tre tipologie predefinite:

  • Transient: l’istanza della classe viene creata ogni volta che ne viene fatta una richiesta
  • Scoped: l’instanza viene creata una sola volta per ambito. Nella maggior parte dei casi, lo scope si riferisce ad una richiesta web. Non necessariamente lo scope è quello web, potrebbe ad esempio essere una funzione in Azure.
  • Singleton: l’istanza viene creata una sola volta (alla prima richiesta). Tutte le altre richieste useranno l’unica risorsa.

Quando una richiesta viene instradata in un controller, viene processata insieme alle sue dipendenze.

E’ compito del framework istanziare la dipendenza a partire dall’interfaccia richiesta.

Installazione

Il team di ASP.NET definisce il framework per la DI  all’interno di Microsoft.Extensions.DependencyInjection.

Questo approccio consente di utilizzarlo non solo nell’ambito web, ma ad esempio anche all’interno di app basate su eventi (come le Azure Functions e le AWS Lambda).

E’ sufficiente includere il pacchetto tramite nuget:

La registrazione delle dipendenze può essere effettuata,ad esempio:

Una particolare attenzione deve essere posta ai servizi che implementano IDisposable: verranno eliminati quando il loro ambito termina.

Per questo motivo è sempre importante risolvere la dipendenza in un ambito e non dal root container: se viene risolto IDisposable da un root container si potrebbero generare memory leak poiché i servizi non vengono distrutti fino a quando il root container non viene distrutto.

Pubblicato da

Andrea Merlin

Laureato in informatica, diversi corsi di specializzazione legati allo Sviluppo Software e alla Computer forensics. Appassionato di nuove tecnologie, amo la programmazione, la Business Intelligence e tematiche legate alla Privacy.Sempre alla ricerca di nuove idee, stimoli … e progetti da seguire!Amo trascorrere il tempo libero in Val Borbera, un piccolo angolo del Piemonte, in provincia di Alessandria.