Nonostante la mia iniziale diffidenza verso gli ORM (il primo incontro fu con un acerbo iBATIS) mi sono poi ricreduto e devo dire che sicuramente l'accesso al dato tramite ORM sta diventando QUASI un MUST. NON è infatti una novità che un pò tutte le grandi case si stanno orientando nella costruzione/implementazione di tali framework (chi prima, chi in ritardo). Faccio qui un mio personalissimo punto della situazione.
Inizio con il chiedermi ORM sempre comunque? IMHO NO, preferisco valutare l'effort di una soluzione classica e l'effort dell'uso di un ORM per il progetto che devo affrontare. Sempre e comunque architettura a provider/plugin in modo che posso cambiare la scelta senza problemi/impatto sui livelli NON-DATA (Archietture a plugIn, pensieri e considerazioni ).
Quando si parla di ORM per .NET si parla in primis di NHibernate, figlio di Hibernate che nasce dal mondo java e che porta su di se il bagaglio di esperienza di diversi anni; questo lo rende uno strumento sicuramente solido ma che si porta sulle spalle tutti i problemi dei progetti di lunga data: interfacce e classi obsolete mantenute vive per garantire retro-compatibilità e così vecchio, nuovo e obsoleto si mischiano in purpuri di API in cui è difficile a volte divincolarsi. Insomma IMHO NH necessita di un pò di pulizia! Inoltre il porting è stato fatto AS IS da java e quindi porta con se quelche errore di "traduzione" o scelta opinabile, ricordate "NHibernate e qualche critica alla progettazione"?
Per progetti semplici - magari con tante CRUD e ricerche - e database lineari, Nhibernate - ad oggi - è sicuramente uno strumento validissimo. Per progetti complessi e database NON normalizzati e/o terribilmente denormalizzati potrebbe essere richiesto un effort più alto rispetto agli strumenti classici. Nh rimane a mio avviso una soluzione indispensabile per progetti grossi dove si vuole garantire una facile/veloce portabilità su più database con diverse tecologia e/o strutture.
Cosa PROPRIO non mi piace di Nh? La strategia di lazy load... occorre mantenere una sessione di lavoro aperta perchè NON ne apre/ri-apre una in automatico. Ne avevo già parlato con janky e il problema è relativo alla gestione delle transazioni e oggetti in transazione; sicuramente sono buoni motivi dovuti a una scelta ragionata ma NON posso NON nascondere il mio disappunto sulla questione. Le entità sono persistance ignorance ma occorre tenere vivo il provider e/o la UnitOfWork per tenere viva una sessione di Nh (NON sempre banale e effort magari NON necessario/di troppo per i nostri progetti)... janky ne parlava qui "NHibernate: Session e Lazy Loading". Per cui mi sento di dire che le entità sono persistence ignorance ma l'applicazione rischia di NON esserlo... perchè le bombe (eccezioni NON previste) posso scoppiare in qualsiasi momento come qui descritto anche da Marco ("[NHibernate] Session.Get o Session.Load ? ");
Anche MS - ammainata la bandiera delle data access globali, dataset tipizzati e datatable - si sta avvicinando agli ORM... Entity Framework, che fa già tanto parlare nonostante NON sia ancora ufficialmente uscito, risulta/si prospetta una libreria decisamente interessante e perfettamente integrata con VS. Sempre grazie a janky abbiamo questa tabella comparativa per il "Confronto: NHibernate - Linq 2 SQL - Entity Framework".
Entity Framework si presenta come essere sicuramente un valido ORM in competizione con NHibernate e la sua integrazione con VS da sicuramente vantaggi nella scelta... quello che mi frena verso tale framewrok è che sembra NON essere Persistence Ignorance :( Le entità in modo o nell'altro dovrebbero essere sporcate con amenicoli tecnologici a mio avviso evitabili come lo è per Nh che compila al volo - una tantum - classi proxy per la gestione di cavilli tecnologici... unico vincolo di la necessità di avare proprietà virtual, ma in merito avevo già detto la mia in "Come mi piace implementare il Lazy Load con un pizzico di polimorfismo..."
o0O( Il post si è fatto fin troppo lungo... dirò la mia sull'importanza che dò alla persistence ingnorance in un'altro momento...)
Technorati Tags:
Data ORM Nhibernate EntityFramework
posted @ martedì 6 novembre 2007 14:09