giovedì 30 settembre 2010

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

Database ad oggetti

Volevo segnalarvi un interessante motore per database ad oggetti.
Si chima db4o, è un progetto open-source e sono presenti sia una versione per Java che per .NET (2.0 e 3.5).
Per chi non lo sapesse i database ad oggetti sono una valida alternativa ai database relazionali classici. I miglioramenti in fase di stesura del codice sono subito evidenti: gli oggetti che utiliziamo per creare i nostri programmi sono i dati che verranno salvati. Non c'è bisogno di tradurre il mondo ad oggetti nel modello relazionale tipico dei DBMS classici. Ecco un semplice esempio in C#:


IObjectContainer db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), yapFileName);
try 
{
     db.Store(obj);
}
finally
{
    db.Close();
}


Dove yapFileName è la stringa che contiene il percorso fisico del database (un singolo file con estensione .yap) e obj è il riferimento ad un qualsiasi oggetto del tuo modello.