L'Identity Map è uno dei pattern più importanti perchè permette di avere in memoria una sola istanza di un'oggetto per ogni sessione. Questo è fondamentale perchè se si hanno 2 versioni di uno stesso oggetto recuperate dal db, queste possono essere potenzialmente diverse causado non pochi problemi.
Nel mio framework, ho introdotto questo pattern da poco per via dei problemi avuti in passato ed ho optato per un'implementazione che è un pò arzigogolata, ma mi sembra essere flessibile e completa. Alcuni reputano che questo Pattern appartenga allo strato di business, ma trattandosi di recupero dati preferisco mantenerlo nello strato dati.
Innanzitutto, ho creato un attributo (KeyAttribute) che serve per decorare le classi di dominio identificando quali sono le proprietà chiave. Ce ne possono essere anche più di uno come nei casi in cui si identifica una persona per l'Id preso dal db o per il Codice Fiscale o la parita IVA.
Successivamente, ho creato una classe che contiene una lista degli oggetti letti dal db ed un metodo che gestisce la ricerca. Questo metodo accetta in input la query, il tipo di oggetto che si sta cercando (tramite generic), la chiave ed i valori della chiave in base al quale si vuole verificare se l'oggetto è già in memoria, ed un delegate che identifica quale metodo deve essere invocato per eseguire il mapping tra il datareader restituito dalla query e l'oggetto da creare (potevo usare uno strategy, ma questi metodi preferisco tenerli statici visto che non hanno bisogno di stato).
Nel metodo, viene ispezonata la classe dell'oggetto da recuperare alla ricerca dell'attributo il cui nome corrisponda alla chiave passata in input. Una volta trovato l'attributo, si recuperano le proprietà che questo referenzia e si cerca nella lista degli oggetti se ne esiste uno di quel tipo e con le proprietà trovate che abbiano i valori passati in input al metodo. In caso affermativo viene restituito l'oggetto presente nella lista, altrimenti si esegue la query e viene invocato il delegate per costruire l'oggetto che viene infine inserito nella lista e poi restituito.
Lo storage della lista è stato un nodo che ho chiarito all'ultimo, se mi trovo in un'applicazione web allora viene usato il contesto della richiesta, nel caso di un'applicazione windows utilizzo una variabile statica. Per ora questo codice è cablato, ma confido al più presto di buttare giù un'interfaccia cosìda rendere il meccanismo pluggabile (non si sa mai che esigenze si possono avere nel futuro).
Stay tuned...
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Chi si ricorda dei DataSet?, l'8 ottobre 2008 alle 22:04
- Caching nel DataLayer, il 29 gennaio 2007 alle 19:49
- Collection generiche come proprietà, il 9 ottobre 2006 alle 00:51
- I pattern che uso in genere, il 25 gennaio 2006 alle 00:38
- Factory Pattern e Generics per l'astrazione dal db, il 16 settembre 2005 alle 01:29