Domanda

Nuovo su NHibernate (la mia dichiarazione di non responsabilità). Mi sono imbattuto in un simile e interessante articolo riguardante MVC , tuttavia, I sono più curioso di sapere quali sono le migliori pratiche generali per la gestione delle sessioni di NHibernate all'interno di un'applicazione web generica.

Mi sono imbattuto nel progetto Burrow , ma sto iniziando a rendersi conto che sembrano esserci alcune direzioni diverse da prendere. Sono consapevole che probabilmente non è nel mio interesse creare una nuova SessionFactory ogni volta che ho bisogno toccare il database, quindi sono interessato a ciò che la community fa per gestire le sessioni. Usi Burrow? Avvolgi la tua SessionFactory in un singleton?

Ogni direzione o intuizione è sempre molto apprezzata.

È stato utile?

Soluzione

Per rispondere direttamente alla tua domanda, l'oggetto ISessionFactory dovrebbe essere un singleton. Puoi farlo a livello di codice (ovvero avvolgendolo in un singleton C #) o configurandolo nel tuo contenitore IoC.

Per quanto riguarda le sessioni, Burrow ha un bell'aspetto ma il modello prodominante e più semplice per le sessioni in applicazioni web - OpenSessionInView - è pronto all'uso con NHibernate 2.0.0. Cioè, il tuo codice di accesso ai dati chiama ISessionFactory.GetCurrentSession () anziché ISessionFactory.OpenSession () . Indichi quindi come viene gestita la sessione corrente della fabbrica specificando un'implementazione di ICurrentSessionContext . NHibernate ne fornisce due pronti all'uso per assegnare la sessione alla richiesta Web. Questo è noto come "sessioni contestuali" nella documentazione.

Senza dubbio un'applicazione web più complessa potrebbe richiedere conversazioni più durature con un caricamento lento complesso ecc., ma per un'applicazione web standard le sessioni contestuali di NHibernate dovrebbero essere sufficienti.

Altri suggerimenti

Ho scritto una serie di post di blog su questo argomento riguardanti i modelli di accesso ai dati NHibernate / Fluente NHibernate.

Il primo che raccomando è astratto l'interazione di NHibernate.

Creazione di un repository NHiberate generico generico ed estensibile

Quindi per la gestione della sessione ho implementato la "Sessione per conversazione commerciale" modello che invece di avere una sessione NH esiste per la durata di una singola richiesta di pagina che è comune esiste per una serie di eventi, dice una pagina che ti permette di effettuare un gruppo di modifiche a un modulo e poi alla fine applicali tutti permanentemente o cancellali.

Conversazione per Transazione commerciale utilizzando PostSharp e IoC

Se avessi scritto questo post oggi, non avrei usato PostSharp di nuovo per gestire il codice AOP (Aspect Orientated Programming) nel mio progetto o avrei usato Linfu.AOP o un altro framework per eseguire l'interazione AOP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top