Come mi piace implementare il pattern Identity Map

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...

Nella stessa categoria

Commenti
Cradle scrive:
Come mi piace implementare il pattern Identity Map

Ciao Stefano,
secondo me la tua implementazione è probabilmente più vicina al pattern Repositoryhttp://www.martinfowler.com/eaaCatalog/repository.html che alla Identity Map vera e propria. Il compito di quest'ultimo, infatti, è esclusivamente quello di garantire che la database identity e la reference identity coincidano all'interno del medesimo contesto transazionale, non di gestire vari sistemi di ricerca. Per questa ragione, quindi, tante volte basta un semplice dictionary.

Però, ovviamente, resto tuned perché è comunque un discorso molto interessante!!
19/09/2006 ore 9.59 | 6 risposte
»»»» SM15455 scrive:
Re: Come mi piace implementare il pattern Identity Map

Ciao,

Forse ti confondi con il Pattern IdentityField http://www.martinfowler.com/eaaCatalog/identityField.html. Il pattern Identity Map serve per assicurare che un solo oggetto sia caricato in memoria e questo è quello che faccio. Il metodo di ricerca mi seve solo per essere in grado di identificare l'oggetto in più modi, ma lo scopo rimane quello.

Byez
19/09/2006 ore 10.49 | 1 risposta
Cradle scrive:
Re: Come mi piace implementare il pattern Identity Map

No Stefano, non mi confondevo :)

Assicurare che DB identity e reference identity coincidano vuol dire avere una sola istanza in memoria per riga del db all'interno della stessa transazione: diciamo la stessa cosa!

Ciò che rimarcavo è solo l'introduzione di questi metodi di ricerca, che sono al di fuori delle responsabilità dell'identityMap, che imho dovrebbe permettere ricerche solo per chiave (la quale è un identityField) e che dovrebbe essere estremamente veloce nell'effettuare tali ricerche (e, non ho visto la tua implementazione, ma l'utilizzo di campi NON UNICI come chiavi di ricerca mi fa pensare che tu non possa avvalerti di un dictionary).

Tutto qui! Si fa pour parler!
19/09/2006 ore 11.01 | 1 risposta
»»»» SM15455 scrive:
Re: Come mi piace implementare il pattern Identity Map

Se non ti eri confuso chiedo scusa.

I metodi di ricerca mi servono in casi in cui l'oggetto sia ricercato per campi diversi dall'id.
Es. Una persona può essere cercata per id o per codice fiscale. Nel datalayer ho 2 metodi di ricerca FindById e FindByCode. A questo punto gli oggetti già caricati sono si in una lista, ma identificabili per 2 campi a seconda del tipo di ricerca. Ecco il perchè della cosa. Se hai altre vie suggerisci pure

Byez
19/09/2006 ore 11.22 | 1 risposta
Cradle scrive:
Re: Come mi piace implementare il pattern Identity Map

Ma figuriamoci, mica servono scuse!! :)

Quello che voglio dire è che la tua necessità non la soddisfi con una IdMap, ma con un altro tipo di oggetto, tutto qui. La IdMap non è una cache, il caching è una sorta di "effetto collaterale", passami il termine.

Supponi tu voglia ricercare le persone che hanno un certo cognome: in uno scenario simile, con IdMap ti assicuri che, una volta recuperati i dati da db, se quella chiave primaria esiste all'interno della IdMap, piuttosto che costruire una nuova istanza, devi aggiornare quella esistente ed includere quest'ultima nella lista di risultati.

Che poi la IdMap non sia ciò che risolve la tua specifica problematica è un altro paio di maniche :)

Ciao Stef, spero di vederti a MI tra un mesetto!
19/09/2006 ore 13.05 | 1 risposta
»»»» SM15455 scrive:
Re: Come mi piace implementare il pattern Identity Map

Ciao,

io non ricerco nella idmap le persone con un certo cognome, non ho una PrimaryKey leggo da db e poi le confronto se le ho già nella lista in memoria per evitare il doppio oggetto. Il mio discorso parte prima della query e solo nel caso in cui cerco per una key (e ci possono essere più chiavi per una classe).
Comunque che la IdMap faccia anche da cache è normale, è lo stesso Fowler a dirlo verso la fine della sezione dedicata all'identitymap.

btw, sto lavorando per milano ma venendo da roma ci sono cose che devo sistemare, vedremo...

bye
19/09/2006 ore 15.00 | 1 risposta
Cradle scrive:
Re: Come mi piace implementare il pattern Identity Map

Ma se leggi da db e hai già la chiave, che bisogno hai di cercare all'interno della idmap per codicefiscale?

Boh, secondo me non ho capito ciò che dici, mi rendo conto che a chiacchiere e senza codice non è semplice esprimersi su questi concetti.

Vabbé, vorrà dire che aspetterò con curiosità che pubblichi qualcosa :-)

Grazie della piacevole chiacchierata, ciapz!
19/09/2006 ore 15.10
imperugo scrive:
Come mi piace implementare il pattern Identity Map

Io sono tra quelli che la mette nel Business, per me il DAL fa solo il DAL ossia persistenza e lettura da DB, quindi l'Identi Map la metto nel Biz, se lì non trovo il dato che mi servve allora chiedo aiuto al DB.
Tutto quello che è comune a qualsiasi strato dati per me dovrebbe andare sempre nel biz.
18/09/2006 ore 23.44 | 7 risposte
»»»» SM15455 scrive:
Re: Come mi piace implementare il pattern Identity Map

Ciao Ugo,

capisco il tuo punto di vista, ma per me il datalayer deve fornire i dati. Come e da dove li prende sono cose che al business non interessano. Ovviamente il tutto IMVHO. Comunque non credo esista una soluzione giusta, è più che altro una questione di gusti.

Byez
19/09/2006 ore 0.07 | 2 risposte
imperugo scrive:
Re: Come mi piace implementare il pattern Identity Map

vai qui http://www.ugidotnet.org/workshops/workshops_detail.aspx?ID=9ed3a5e7-a69c-4258-af7b-6ec3a8bcd025 di pattern e corrette implementazioni di Businees (biz  ) e DAl ne vedi di sicuro, in più guardati questi webcast http://blogs.ugidotnet.org/pape/archive/2006/09/13/WebcastAspireArchitect.aspx sia ll'evento di ottobre che in questi webcast troverai Ricky.

Ti segnalo anche un link interessante sul blog di Andrea
http://blogs.ugidotnet.org/pape/archive/2006/09/14/DataAccessLayer101.aspx

E ti confermo il PoEAA che ti ha segnalato Cradle e anche il GoF (Gans of For) che solo le 2 bibbie

Beh direi che hai un po' di materiale ;)
19/09/2006 ore 10.21 | 1 risposta
PadovaBoy scrive:
Re: Come mi piace implementare il pattern Identity Map

Scusate se mi reintrometto in questo tipo di discussioni, ma voi dove avete imparato tutti sti Biz, Dal, BL etc...(biz sinceramente mi manca: bisness interapt zorro?!)?
Ma sopratutto dove avete imparato le varie logiche/pattern per la suddivisione dei vari strati di un software?
Purtroppo vengo da un 3-4 anni di vb e di ASP e mi sto scontrando con un nuovo mondo fatto di oggetti, strati software, generics e pattern...e diamine se non mi vien voglia di capirci qualcosa ;)
Intanto che aspetto da amyzon 4 libri sui pattern, qualcuno mi sa dare una dritta su un sitarello di acronimi o qualche spunto da dove cominciare?!

Tnx ;)
19/09/2006 ore 9.18 | 1 risposta
PadovaBoy scrive:
Re: Come mi piace implementare il pattern Identity Map

Woa  !
Gentilissimi

Missà che mi prendo qualcosa e comincio a darci un'occhiata.

Già che ci sono vi indico i libri che sto per prendere:

Domain-Driven Design: Tackling Complexity in the Heart of Software - Eric Evans; Hardcover

Applying Domain-Driven Design and Patterns: With Examples in C# and .NET - Jimmy
Nilsson;

Design Patterns For Dummies (For Dummies (Computer/Tech)) - Steve Ph.D. Holzner; Paperback

Patterns of Enterprise Application Architecture (The Addison-Wesley Signature Series) (Hardcover)


Di quanto ho capito il PoEAA è l'ultimo (quello che mi ha segnalato Cradle già in un altro post)
Gof mi manca cos'è?!

Ps: ma voi dove comprate libri? Io sto impazzendo: l'unica è ordinarli da Amazon!

Pps: sforo il tema: qualche consiglio anche per un libro sullo studio delle interfacce?
Pensavo di prendere questi:

Ambient Findability - Peter Morville; Paperback
Designing Interfaces - Jenifer Tidwell; Paperback
Head First Design Patterns (Head First) - Elisabeth Freeman; Paperback

Grazie mille ancora, siete gentilissimi :)
19/09/2006 ore 10.27
imperugo scrive:
Re: Come mi piace implementare il pattern Identity Map

Ciao Stefano,

Beh per definizione un pattern è una soluzione più generica possibile a problemi più comuni e questi devono poter funzionare in applicativi differenti, ma nulla ci vieta di adattare il patter ad una nostra esigenza particolare o Idea.
Tutto questo giro è per dire che uno lo può mettere dove vuole se risolve il suo problema e se per la sua idea è più corretto. Non è necessario attenersi al 100% alla teoria, ma la mia idea di metterla nel biz mi è venuta facendomi una domanda.

Se cambio lo strato DAL perchè passo da SQL a MYSQL o ORACLE, mi devo rifare l'identity map per ogni strato????

La risposta è stata si.

Dato che la mia pigrezza è più che affermata ho deciso di metterlo nel biz.


BTW che fancazzista che sono

P.S.: ci sei a milano il 18-19 all'Architecture Days??
19/09/2006 ore 10.31 | 1 risposta
»»»» SM15455 scrive:
Re: Come mi piace implementare il pattern Identity Map

Ciao,

ti consiglio di scaricarti gli esempi della sessione di Riccardo al RealCodeDay di Firenze.

http://www.dotnetcircle.it/firenze05.aspx.

Non sono ovviamente completi (mancano aluni pattern fondamentali come lazyloading, identitymap e altri) ma sono un'ottima base per capire come stratificare un'applicazione.

byez
19/09/2006 ore 9.37
»»»» SM15455 scrive:
Re: Come mi piace implementare il pattern Identity Map

Ciao Ugo,

Hai perfettamente ragione, i pattern sono teorici quindi all'atto pratico si devono personalizzare per le proprie esigenze.

BTW, nel mio caso anche cambiando DAL posso sfruttare le stesse classi perchè sono DBAgnostic ed essendo in un mio framework non ho problemi.

P.S. Per gli Architecture Days ci sto lavorando, ma sarò anche molto impegnato a novembre quindi devo vedere.

Byez
19/09/2006 ore 10.42
novecento scrive:
Come mi piace implementare il pattern Identity Map

ciao Stefano,
interessante idea, come hai pensato di affrontare le ricerche per più campi e le paginazioni?
18/09/2006 ore 18.37 | 2 risposte
»»»» SM15455 scrive:
Re: Come mi piace implementare il pattern Identity Map

Ciao Alessio,

l'attributo che metto in testa contiene una lista di campi chiave. ad esempio

[key("Nome, Cognome, DataNascita")]
public class Persona

Così facendo posso utilizzare quanti campi voglio per stabilire la chiave.

Per quanto riguarda le paginazioni cosa intendi?

Byez
18/09/2006 ore 19.30
novecento scrive:
Re: Come mi piace implementare il pattern Identity Map



l'attributo che metto in testa contiene una lista di campi chiave. ad esempio

[key("Nome, Cognome, DataNascita")]
public class Persona

Così facendo posso utilizzare quanti campi voglio per stabilire la chiave.

Per quanto riguarda le paginazioni cosa intendi?


le tue precedenti risposte mi hanno chiarito sull'utilizzo che intendi fare di questa soluzione, non avevo capito che volevi farne un uso "interno" , ecco perchè ti ho chiesto della paginazione, pensavo che esponessi al livello presentazione queste funzionalità (difatti ero un po' perplesso sulla locazione nel tier data)

ok?
20/09/2006 ore 19.11

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.

© 1998-2008 - SMWorld.NET - Il blog di Stefano Mostarda

TagCloud
BLOG INFO
  • Post: 124
  • Commenti: 74
  • TrackBacks: 19
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom OPML

MVP
CATEGORIE
I PIÙ LETTI DEL MESE
IN EVIDENZA