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 18:20

Comments on this entry:

Gravatar # re: Comitato di salvaguardia del contesto di persistenza
by Tommaso Caldarola at 28/04/2008 18: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 Mario Duzioni at 28/04/2008 21: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 Matteo Baglini at 29/04/2008 12: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 13: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.