top of page

Introduzione alla Dependency Injection


La Dependency Injection è un pattern di programmazione, nello specifico è una particolare forma del pattern Inversion Of Control. Con la Dependency Injection una classe non è responsabile dell'inizializzazione delle proprie dipendenze. Ma che cos'è una Dependency? Facciamo un esempio per chiarire le cose. Supponiamo di avere la seguente classe Macchina:

public class Macchina

{

private Motore _motore;

public void Macchina()

{

}

public void Cammina()

{

..

_motore.Start();

..

}

}

La variabile _motore è una Dependency per la classe Macchina. In pratica l'oggetto macchina dipende dall'oggetto motore (in effetti senza motore la macchina è poca cosa). In termini informatici la dipendenza (Dependency) non è altro che un campo di una classe (variabile di istanza) contenente il riferimento ad un oggetto esterno. Modifichiamo l'esempio precedente in questo modo:

public class Macchina

{

private Motore _motore;

public void Macchina(Motore motore)

{

_motore = motore;

}

public void Cammina()

{

..

_motore.Start();

..

}

}

Attraverso il costruttore possiamo specificare il motore della nostra macchina: in effetti possiamo iniettare un oggetto Motore nella variabile di istanza _motore; L'Injection avviene proprio quando dall'esterno della classe che contiene la Dependency viene passata la dependency stessa già inizializzata. Vediamo come questo avviene:

public class MacchinaTest

{

public static void Test()

{

Motore mo = new Motore();

Macchina ma = new Macchina(mo);

ma.Cammina();

}

}

In questo caso la "Dependency Injection" è avvenuta tramite costruttore, ma tale tecnica può essere realizzata con un metodo "set" o tramite Interfaccia.

Esistono infatti 3 tipi di Dependency Injection: 1.Constructor Injection 2.Setter Injection 3.Interface Injection

1.Dependecy Injection tramite costruttore (Constructor Injection): la dependency (variabile, cioè il membro della classe) viene inizializzata grazie al passaggio del parametro nel costruttore public class Esempio { private Risorsa risorsa; public void Esempio(Risorsa r) { risorsa = r; } public void foo() { .. risorsa.faiQualcosa(); .. } }

2.Dependecy Injection tramite setter: c'è un metodo set a cui viene passato il parametro che serve per inizializzare la variabile public class Esempio { private Risorsa risorsa; public void Esempio() { } public void setRisorsa( Risorsa r) { risorsa = r; } public void foo() { .. risorsa.faiQualcosa(); .. } }

3.Interface Injection: viene creata l'interfaccia in cui bisognerà andare ad implementare un metodo che servirà per l'inizializzazione della variabile public interface IntefaceRisorsa{ void mount(Risorsa r); } public class Esempio implements IntefaceRisorsa{ private Risorsa risorsa; public void mount(Risorsa r) { this.risorsa= r; } }

bottom of page