Comitato di salvaguardia del contesto di persistenza

Sarà quasi sicuramente un caso, ma in giro per il web vedo veramente pochi riferimenti al contesto di persistenza e sulle problematiche ad esso connesse.

Non che la cosa non mi faccia dormire la notte, ma ci sono veramente tanti aspetti a riguardo che ho dovuto affrontare nell'ultimo anno (incredibile come vola il tempo!) e mi sorprende che se ne parli davvero così poco.

Mi rendo conto di scrivere cose scontate, ma (citando nozioni apprese dal buon Janky):

  • NO contesto di persistenza? NO lazy load delle entities (tramite OR/M)!
  • NO lazy load delle entities? NO parent-child bidirezionale!
  • NO parent-child bidirezionale? NO "walking the graph"!

...e se non possiamo passeggiare sul grafo direi che forse c'è qualcosa da rivedere nella nostra architettura OO.

Tornando al contesto di persistenza, tanto per dirne una così al volo, ogni OR/M utilizza una sua implementazione del contesto di persistenza (la Session nel caso di NHibernate, il DataContext nel caso di Linq2Sql) ma, se non si vogliono legare mani e piedi dell'applicazione ad un ORM specifico, è necessario astrarre questo componente applicativo.

Anche perchè oggi adottiamo l'ORM scelto, domani (o dopo domani) quasi sicuramente esisterà un nuovo ORM migliore (su molteplici aspetti) e dover mantenere quell'applicazione sull'ORM "vecchio" non la considero una scelta indolore. Dopotutto, pensandoci, siamo solo al primo (o secondo) approccio da parte di Microsoft al settore ORM ed IMHO possiamo aspettarci grandi passi avanti nel futuro prossimo.

Le interfacce di base del concetto di "PersistenceContext" e relativa Factory che ho astratto sono le seguenti (anche se ho seri dubbi sull'utilizzo del nome IPersistenceContextProvider):

E questa é l'implementazione specifica per NHibernate con relative classi di appoggio, che mi permettono in effetti di scrivere poco, ma veramente poco codice per ottenere i risultati desiderati senza rinunciare a tutti i requisiti di transazionalità che richiedono tutte le applicazioni e portandomi dietro tutte le impostazioni di tuning relative agli specifici db utilizzati (SqlServer, nel mio caso).

Rimangono ancora parecchi punti interrogativi (come, per esempio, quel metodo InsertOrUpdate che mi sa tanto di tentativo "non completamente gestito") e la sensazione è di aver toccato solo la punta dell'iceberg.

Per ora, che io sappia, EntityFramework e Linq2Sql non permettono ancora di scrivere entità, e di conseguenza applicazioni, persistence ignorant, ma quando si arriverà (spero presto) a soddisfare anche questo requisito, ovviamente implementerò anche il relativo codice per questo/i ORM di casa Microsoft.

Insomma, per concludere, il dubbio che ho è:

  1. la maggior parte degli sviluppatori implementa questi aspetti in modo talmente semplice e veloce da non suscitare interesse?
  2. la maggior parte degli sviluppatori non utilizza un ORM (e di conseguenza probabilmente non utilizza un Domain Model)?
  3. la maggior parte degli sviluppatori non astrae il concetto di "contesto di persistenza"?
  4. sono io che giro troppo poco sul web? (io voto questa!)

Print | posted @ lunedì 28 aprile 2008 15.20

Comments on this entry:

Gravatar # re: Comitato di salvaguardia del contesto di persistenza
by Tommaso Caldarola at 28/04/2008 15.52

SOno del tuop stesso parere, il bello è che discutendo sui vari gruppi tutti sono d'accordo nel dire DTO is the law, ok, ecco che DTO e grafo iniziano ad accozzarsi, soprattutto quando di mezzo c'è il 3-tier.
Gravatar # re: Comitato di salvaguardia del contesto di persistenza
by Matteo Baglini at 28/04/2008 16.29

Ciao Mario!

un qualcosa di simile si trova qui:
http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/10/nhibernate-and-the-unit-of-work-pattern.aspx
http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/13/nhibernate-and-the-unit-of-work-pattern-part-2.aspx
http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/26/nhibernate-and-the-unit-of-work-pattern-part-3.aspx

Il problema grosso secondo me emerge quando la tua app non è separata solo in layer ma in tier (come indica Tommaso). Come fai a gestire il lazy quando la tua entity passa da un tier (fisico) ad un'altro??
Gravatar # re: Comitato di salvaguardia del contesto di persistenza
by Tommaso Caldarola at 28/04/2008 16.55

Per il lazy across the tiers si può seguire il progetto NHibernate.Remote (http://slagd.com/?page_id=6); io nel mio sistema che sto gestendo al momento ho il lazy a true con layer fisici, e poter navigare il grafo senza sapere dove mi trovo è il massimo... non sempre DTO è la panacea per tutto.
Gravatar # re: Comitato di salvaguardia del contesto di persistenza
by Mario Duzioni at 28/04/2008 18.47

Ciao, lieto di non sentirmi una particella di sodio!! :-D

Matteo, n-tier e n-layer di solito vengono usati come sinonimi per lo stesso concetto (http://it.wikipedia.org/wiki/Architettura_three-tier), probabilmente ti riferisci allo scambio di dati tra differenti sistemi (Remoting, DTS, ecc.).

I link che mi hai indicato, se non erro (ho dato purtoppo solo una rapida occhiata) sono relativi all'implementazione di una UnitOfWork, che è qualcosa di molto diverso da un contesto di persistenza. Può essere anche quella una scelta, ma personalmente la reputo molto meno efficace.

Rispondendo alla tua domanda (se per tier intendevi "sistemi"), nulla ti vieta di implementare a livello di "middle-tier" (inteso come layer di business) un DistribuitedPersistenceContext che implementa comunque IPersistenceContext e magari utilizza il servizio transazionale di Windows. ;-)

Se invece per n-tier intendi proprio i tre layers... non ho capito la domanda!!! :-D
Gravatar # re: Comitato di salvaguardia del contesto di persistenza
by Andrea Canegrati at 28/04/2008 22.42

Direi che siamo vittime del "Mastering NHibernate" e della Persistence Contextite acuta :) Anch'io ho adottato una soluzione simile, dove faccio anche un grosso uso del pattern repository e ho implementato una semplice (ma comoda) soluzione di multi-contesto di persistenza, in modo da risolvere le classiche situazione con diverse sorgenti dati.
Gravatar # re: Comitato di salvaguardia del contesto di persistenza
by Matteo Baglini at 29/04/2008 9.06

@Andrea: Io non sono una vittima del "Mastering NHibernate", mi sono auto-inflitto il "male" :-) .

@Mario: si, è vero che certe volte layer e tier sono la solita cosa allora per non cadere in tranelli di naming diciamo tra layer logici e layer fisici. Quei post usano il concetto di UoW come qui si usa Contesto di Persistenza, vale a dire un modo astratto di incapsulare la Session di NH, la quale è già UoW ed altri mille pattern di Fowler. Ti faccio un esempio per chiarirti quello che intendevo, il lazy load si NH con famoso pattern OpenSessionInView per le applicazioni web funziona solo se te hai dei layer logici e non fisigi, perchè nel secondo caso la session sta (fisicamente) su un'altra macchina, allora che fai? come arrivi al client? dal tuo middle-tier generi dei DTO ecco che come diceva Tommaso "DTO e grafo iniziano ad accozzarsi".

Spero di essere stato più chiaro!
Gravatar # re: Comitato di salvaguardia del contesto di persistenza
by Matteo Baglini at 29/04/2008 9.11

@Tommaso: progetto interessante non lo conoscevo, vediamo se riesco a tirarci fuori qualcosa di buono, grazie!
Gravatar # re: Comitato di salvaguardia del contesto di persistenza
by Mario Duzioni at 29/04/2008 10.03

Ciao Matteo, continuo a non essere del tutto in accordo su quello che scrivi, ma proporrei di spostare la discussione su GUISA (altrimenti qui ci perdiamo i pezzi)! :-)

http://www.guisa.org/forums/1864/ShowThread.aspx#1864
Comments have been closed on this topic.