NHibernate e le collection type-safe

Una delle maggiori problematiche per chi ha avuto qualche esperienza con NHibernate è il fatto che questo O/RM non gestisce direttamente collection strongly-typed. Ammetto di non aver cercato moltissimo in giro per la rete, ma in quei 3 o 4 esempi che ho guardato, le business entities avevano sempre la forma

public class Master
{
    
// ... more code ...
    
private IList details;
    
public IList Details
    {
        
get return details; }
    }
}

Questo tipo di implementazione pone alcune problematiche: oltre al fatto di essere weakly-typed, può funzionar bene se viene utilizzata in una pagina ASP.NET, grazie al databinding poco "interattivo", ma se proviamo a collegarla ad una windows forms perdiamo un sacco di funzionalità a cui eravamo abituati usando i DataSet (il refresh dei dati sullo schermo quando aggiungiamo un elemento alla collection, tanto per dirne uno...). Non mi dilungo oltre, se non per dire che le soluzioni provate (che vanno dal tentativo di utilizzare BindingList<T>, a quanto proposto da Ayende Rahien o a quest'altra alternativa di Andrew Arnott) non mi convincono al 100%.

Per fortuna, però, non ho girovagato in rete invano : mi sono imbattuto qui, dove ho trovato un'ottima collection generic, che implementa IBindingList, e che a prima vista (dopo una lettura del codice sorgente) sembra essere addirittura migliore della BindingList<T> contenuta nel FX 2.0, dato che supporta anche sorting e find. E' molto generale e quindi può essere utilizzata anche da chi non si avvale di NHibernate, ma, in caso contrario, viene fornita anche di un accessor specifico da utilizzare nei file di mapping. Certo, non derivando da PersistentCollection FOOOORSE ha bisogno di qualche ritocco per funzionare correttamente con NHibernate, oltre al fatto che a me piacerebbe implementasse anche IComponent per poterla integrare nel designer di Visual Studio, ma credo si tratti veramente di un ottimo lavoro! Da domani proverò a metterci un po' le mani sopra...

powered by IMHO 1.3

9 Comments Filed Under [ .Net 2.0 NHibernate ]

Comments

# re: NHibernate e le collection type-safe
Gravatar Nhibernate, come altri framework, sono nati per "migliorare" o per superare i limiti degli strumenti messi a disposizione di Microsoft. Spesso non contengono le "facilities" di visual studio.
In passato, dopo la "sbornia della novità", ho notato che molti developer hanno abbandonato quegli strumenti: personalmente ho capito che il DataAdapter non faceva al caso mio.. ;-)

L'uso delle IList è presente anche in altri ORM come il Wilson ORMapper (http://www.ormapper.net): è un compromesso.

In asp.net non ho sentito il bisogno delle collection strongly-typed, se non se devi ritornare la collection da un webservice.
Left by Marco Trova on 22/03/2006 8.01
# re: NHibernate e le collection type-safe
Gravatar @ Marco De Sanctis
La soluzione di Ayende è carina, non conosco l'altra, ma vi è da dire che siamo ormai prossimi al rilascio di una nuova versione di NHibernate che porterà quasi tutti i benefici della 3.0 java con in più il supporto nativo ai generics, stando ai movimenti delle mail interne degli sviluppatori

@Marco Trova
l'uso di IList IMHO dovrebbe essere mantenuto anche a dopo l'avvento dei generics in NH, più che un compromesso è un modo elegante di mantenere l'inversione di controllo...
è l'object factory (in questo caso la session) che decide che tipo di Collezione istanziare per un oggetto (ordinata, non ordinata, etc...a seconda di dipendenze esterne).
Left by Giancarlo Sudano on 22/03/2006 10.10
# re: NHibernate e le collection type-safe
Gravatar Io questo problema l'ho risolto col meccanismo del wrapping, nel senso che carico le collection via NH come IList però poi nella set esegue un new CollectionTipizzata(nhColl).
Left by Tommaso Caldarola on 22/03/2006 11.26
# re: NHibernate e le collection type-safe
Gravatar La soluzione di Tommaso mi ricorda qualcosa.... :-D
Left by Giancarlo Sudano on 22/03/2006 11.29
# re: NHibernate e le collection type-safe
Gravatar Allora...
Marco Trova: NH è un Data Mapper e serve per persistere entità di un Domain Model. Ora, io il mio domain model vorrei farlo come voglio, (ad esempio utilizzando collection strongly-typed) per ragioni di coerenza e correttezza nel design delle classi, e non mi piace l'idea di DOVER usare un certo approccio per farlo supportare da NHibernate. E questo vale a prescindere dal presentation layer che deciderò di utilizzare, sia esso WinForms che Web.

Janky: Ciò che dici a proposito dell'inversion of control è corretto, ma a me piacerebbe che avvenisse dietro le quinte, senza essere costretto ad esporre direttamente nella mia biz-entity una collection IList. Ciò che sto facendo ora, ad esempio, è una collection generic che implementa anche IBindingList e wrappa IList (permettendone anche la reimpostazione al di fuori del costruttore). Il risultato che vorrei raggiungere è poter scrivere un custom accessor per NH che restituisca e setti la IList interna, così salviamo la inversion of control rimanendo comunque svincolati da NH.
ah... che onore averti tra i feedback del mio blog ;-)

Tommaso: quello che non mi piace di newCollectionTipizzata(nhColl) è il fatto che viene creata una nuova istanza, cosa che può essere scomoda se, ad esempio, doti la tua collection di eventi: chi intercetta tali eventi dovrebbe accorgersi che l'istanza cambia, rimuovere gli handler sulla vecchia istanza e impostarli sulla nuova.

BTW, ci sto lavorando, magari non ne tiro fuori nulla di interessante, magari sì, vi farò sapere ;-)
Left by Marco De Sanctis on 22/03/2006 14.04
# DataSet o Domain Model?
Gravatar
Left by Crad's .NET Blog on 23/03/2006 1.02
# re: NHibernate e le collection type-safe
Gravatar Per janky... lo so, ti devo una birrozza... prima o poi pago il debito!!! Se puoi vuoi pure una pizza mi devi delucidare riguardo qualche altro dubbio...
Left by Tommaso Caldarola on 24/03/2006 9.28
# re: NHibernate e le collection type-safe
Gravatar Per Marco De Sanctis:

si è vero, anche se nel mio progetto lavorando via remoting con oggetti MBV è un comportamento normale purtroppo e richiesto.
Left by Tommaso Caldarola on 24/03/2006 9.48
# re: NHibernate e le collection type-safe
Gravatar Se più riuscito a fare quella collection generic di cui parlavi sopra? mi piacerebbe dargli una occhiata se non ti dispiace.
Left by Enzo Rallo on 11/06/2008 19.07

Leave Your Comment

Title*
Name*
Email (never displayed)
 (will show your gravatar)
Url
Comment*

Please add 1 and 2 and type the answer here:

Preview Your Comment.