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 è:
- la maggior parte degli sviluppatori implementa questi aspetti in modo talmente semplice e veloce da non suscitare interesse?
- la maggior parte degli sviluppatori non utilizza un ORM (e di conseguenza probabilmente non utilizza un Domain Model)?
- la maggior parte degli sviluppatori non astrae il concetto di "contesto di persistenza"?
- sono io che giro troppo poco sul web? (io voto questa!)