Questo post di Andrea, mi da lo spunto per alcune riflessioni su NHibernate che da tempo mi affollano la mente, ma che non ho mai scritto per svariati motivi; ero partito con un commento al post ma molto presto mi sono accorto che la lunghezza non era appropriata, e così ecco questo.
Utilizzo NHibernate da circa 6 mesi (abbondanti) su progetti di diversa natura e con differenti DBMS (Oracle, DB2/400 e SQL Server 2005 Everywhere) e dopo una prima fase di 'innamoramento perverso' ultimamente mi sto un po' 'raffreddando', ed il motivo è il seguente : ho avuto la necessità di debuggare mooolto profondamente NHibernate versione 1.2.0 alpha 1, nella versione per framework 2.0, per correggere alcuni bug davvero subdoli e devo dire che sono rimasto perplesso; mi sono imbattuto in porzioni di codice che definirei 'bislacche', alcune parti davvero poco ottimizzate, nonostante la versione sia per FX 2.0 si fa ancora discreto uso di List, ArrayList & Co. (almeno internamente) ed infine c'è una piccola 'epidemia' di side-effects (comunque documentati).
Ma la cosa che più mi ha "spaventato" è l'impressione che alcuni metodi, ad esempio quelli che dovrebbero 'idratare' i nostri oggetti, vengano eseguiti più volte rispetto al necessario (almeno a mio parere =) ).
Piccolo esempietto
Si supponga di avere un oggetto con chiave multipla mappato alla sua tabella; se devo recuperare un record dal DBMS utilizzo il metodo Get della sessione di NHibernate, passandogli il tipo ed un oggetto con la chiave valorizzata da usare come parametro: supponiamo che la mia classe si chiami Oggetto.
Scrivendo ed eseguendo questo codice
Oggetto parmOggetto = new Oggetto();
parmOggetto.Chiave1 = "X";
parmOggetto.Chiave2 = "Y";
Oggetto retOggetto = sessione.Get(typeof(Oggetto),parmOggetto) As Oggetto;
Ottengo che retOggetto è correttamente istanziato, ma viene "idratato" anche parmOggetto, cosa che secondo me oltre che sbagliata è uno spreco di risorse.
Se a questo aggiungiamo una documentazione pressoché inesistente il quadro si aggrava.
Detto questo io uso e continuerò ad utilizzare NHibernate, che rimane uno strumento utile e potente, ma la domanda che mi pongo incessantemente è : "è davvero questa la strada ?".
Ho dato un'occhiata a LINQ ma ancora non mi convinco, diciamo che spero che i prossimi rilasci siano più chiari, nel frattempo penso e ripenso e mi chiedo se non ci sia un altro modo per gestire la persistenza...mah!
Se mi venisse un lampo, faccio un fischio ;-)
Tags: NHibernate