Qualcuno ha suggerimenti o best practice su come Autofac può aiutare a gestire l'istanza ISh di NHibernate (nel caso di un'applicazione ASP.NET MVC)?Gestione di NHibernate ISession con Autofac
risposta
Non ho molta familiarità con il modo in cui devono essere gestite le sessioni di NHibernate. Detto questo, Autofac ha un'eccellente gestione della durata dell'istanza (scoping e deterministic disposal). Alcune risorse correlate sono this article e this question. Dato che ti trovi in ASP.Net MVC land assicurati di controllare anche in the MVC integration stuff.
Per illustrare questo punto, ecco un rapido esempio su come è possibile utilizzare autofac delegati di fabbrica e il Owned
generica per avere il pieno controllo su istanza vita:
public class SomeController
{
private readonly Func<Owned<ISession>> _sessionFactory;
public SomeController(Func<Owned<ISession>> sessionFactory)
{
_sessionFactory = sessionFactory;
}
public void DoSomeWork()
{
using (var session = _sessionFactory())
{
var transaction = session.Value.BeginTransaction();
....
}
}
}
La configurazione del contenitore per arrivare a questo lavoro è abbastanza semplice. Si noti che non abbiamo a che fare qualsiasi cosa per ottenere i tipi Func<>
e Owned<>
, questi sono messi a disposizione automaticamente dal Autofac:
builder.Register(c => cfg.BuildSessionFactory())
.As<ISessionFactory>()
.SingleInstance();
builder.Register(c => c.Resolve<ISessionFactory>().OpenSession());
Aggiornamento: il mio ragionamento è che, secondo this NHibernate tutorial, la durata di l'istanza di sessione dovrebbe essere quella della "unità di lavoro". Quindi abbiamo bisogno di un modo per controllare sia quando l'istanza di sessione viene creata e quando la sessione viene eliminata.
Con Autofac otteniamo questo controllo richiedendo un Func<>
invece del tipo direttamente. Se non si utilizza Func<>
, è necessario che l'istanza di sessione venga creata in anticipo prima che venga creata l'istanza del controllore.
Successivamente, il valore predefinito in Autofac è che le istanze hanno la durata del contenitore. Poiché sappiamo che abbiamo bisogno del potere di disporre questa istanza non appena l'unità di lavoro è terminata, richiediamo un'istanza Owned
. Smaltendo l'istanza di proprietà, in questo caso verrà immediatamente eliminata la sessione sottostante.
Modifica: Suoni come Autofac e probabilmente altri contenitori possono avere una durata corretta della vita. Se è così, fallo.
Non è una buona idea utilizzare il contenitore IoC per gestire direttamente le sessioni. La durata della sessione deve corrispondere alla tua unità di lavoro (confine della transazione). Nel caso di un'applicazione web, quella dovrebbe quasi certamente essere la durata di una richiesta web.
Il modo più comune per ottenere ciò è con un HttpModule che crea la sessione e avvia la transazione quando inizia una richiesta, quindi esegue il commit al termine della richiesta. Vorrei che HttpModule registrasse la sessione nella collezione HttpContext.Items.
Nel contenitore IoC, è possibile registrare qualcosa come HttpContextSessionLocator contro ISessionLocator.
Devo menzionare che la gestione degli errori generica dovrebbe individuare la sessione corrente e ripristinare automaticamente la transazione, oppure si potrebbe finire per impegnare mezza unità di lavoro.
* Perché * non è una buona idea? –
D'accordo con James su questo, inserisco un'unità di fabbrica di lavoro nei miei controller (asp.net mvc) e creo un'unità di lavoro dall'interno del controller quando richiesto. La fabbrica è solo una classe wrapper (localizzatore di servizio) attorno al contenitore IoC (Structure Map) – AwkwardCoder
@AWC: questo è esattamente quello che farei anch'io.La cosa è che il contenitore di Autofac ti dà le cose di fabbrica OOTB. –
- 1. Gestione di più database con NHibernate e Autofac
- 2. NHibernate - ISession vs. IStatelessSession
- 3. Mocking di una NHibernate ISession con Moq
- 4. NHibernate con Autofac all'interno di ASP.NET (MVC): ITransaction
- 5. Gestione delle eccezioni NHibernate
- 6. Quartz.NET, NH ISession & Ninject Scope
- 7. Gestione delle sessioni NHibernate nell'applicazione WCF
- 8. Pattern di deposito con NHibernate?
- 9. NHibernate GetAll
- 10. Nhibernate/MVC: gestione delle raccolte lazy load in Visualizza
- 11. Uso di autofac con moq
- 12. Gestione delle sessioni NHibernate e caricamento lazy
- 13. Sostituire fabbrica con autofac
- 14. Iniettare DbContext con Autofac
- 15. Che cos'è InstancePerLifetimeScope in Autofac?
- 16. Multiple SessionFactories in Windows Service con NHibernate
- 17. ASP.NET MVC 3, filtri di azione, e Autofac Dependency Injection
- 18. Implementazione iniezione dipendenza Autofac
- 19. Utilizzo di Autofac con eventi di dominio
- 20. ServiceStack NHibernate Sessione per richiesta
- 21. Consigli per la gestione delle sessioni di NHibernate
- 22. Risoluzione dell'interfaccia generica con Autofac
- 23. Integrazione Autofac e Quartz.Net
- 24. Moduli di Autofac con le loro dipendenze
- 25. NHibernate QuerySyntaxException
- 26. Caricamento lento con NHibernate Castle Facility
- 27. Come posso implementare la sessione di NHibernate per richiesta senza una dipendenza su NHibernate?
- 28. Generare database con Nhibernate usando Fluent NHibernate
- 29. nHibernate + applicazione di esempio Mvc3
- 30. NHibernate 3 Cache di query Linq
Hmm ... Vorrei che le persone dessero delle critiche costruttive quando fanno un downvote. –
Anch'io! :) Grazie per la tua risposta - Sto dando un'occhiata ai tuoi suggerimenti – UpTheCreek
Ciao, ho capito tutto qui a partire dal Func> - Perché usare questo? Perché non solo iniettare nell'ISession standard? Non sono sicuro di aver veramente capito cosa fa il func/Owned, ma secondo la documentazione di autofac, se lo usi devi gettare manualmente l'oggetto?
UpTheCreek
http://code.google.com/p/autofac/wiki/NewInV2 –