Factory Pattern e Generics per l'astrazione dal db

di Stefano Mostarda, in Design Patterns,

Non c'è dubbio che una delle tecniche migliori, anzi la migliore, per ottenere un'astrazione dalla base dati è implementare un Factory Pattern. Con la versione 1.x del framework, siamo obbligati a creare un metodo per ogni classe del DataLayer che dobbiamo istanziare, quindi se abbiamo 50 classi di datalayer, ci sara una classe con 50 metodi, o 50 classi con un metodo. Se si vuole risparmiare, si fa un metodo che accetta l'interfaccia che la classe da creare implementa (passandola come object) e che poi torna la classe come object. Lo svantaggio sta nel fatto di perdere la tipizzazione. Tutto questo perchè nella versione 1.x non possiamo definire dinamicamente il tipo di ritorno di una funzione.

Ecco che l'introduzione dei Generics nella versione 2.0 migliora drasticamente il codice. Nei miei progetti ho un file di configurazione che mappa le interfacce con la classe reale e con l'assembly che la contiene (a volte ho un datalayer spalmato in diversi assembly per particolari esigenze) e altre informazioni. A questo punto mi basta invocare il metodo GetClass della classe Factory specificando l'interfaccia come Generic. Leggendo il file di configurazione viene trovata la classe associata, viene istanziata e tornata ottenendo così lo strong typing caratteristico dei Generics.

internal static T GetClass<T>()
{
   XmlDocument d = new XmlDocument();
   d.Load("d:\\MyApp\\db.config");
   string interfaceName = typeof(T).FullName;
   foreach (XmlNode n in d.SelectNodes("Maps/Map"))
   {
     if (n.Attributes["interface"].Value == interfaceName)
     {
       Type type = Type.GetType(n.Attributes["class"].Value);
       object o = Activator.CreateInstance(type, true);
       return (T)o;
     }
   }

throw new DALException("Interface not found in the mapper file");
}
}

Il metodo non è nella sua versione completa, ma è comunque una base di partenza.

Stay tuned...

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese