Sessione StructureMap / NHibernate per richiesta inclusa transazione costante
-
08-07-2019 - |
Domanda
Ho appena iniziato a utilizzare StructureMap nelle mie app MVC e tutto va bene, tranne gestire il mio ITranscation
nel modo corretto.
Quello che voglio fare è creare una nuova ISession su ogni richiesta. Insieme a questo voglio iniziare una transazione.
Alla fine della richiesta commetterò la transazione.
La mia domanda è: come posso farlo nel modo migliore con StructureMap. Ho trovato molti esempi su Google, ma nessuno di essi avvia una transazione con la richiesta e non voglio davvero farlo nei miei metodi.
Grazie in anticipo!
Soluzione
Questi due articoli dovrebbero aiutare.
http://trason.net/journal /2009/10/7/bootstrapping-nhibernate-with-structuremap.html
http://trason.net/journal/2009 /10/14/nhibernate-transactional-boundaries.html
Altri suggerimenti
Probabilmente non è così facile ma ecco la mia opinione. Creare un'unità di lavoro che sostanzialmente avvolge la sessione e la transazione e archiviarla per la richiesta e eseguire il commit o il rollback al termine della richiesta.
public interface IUnitOfWork : IDisposable
{
ISession Session { get; }
void Commit();
void Rollback();
}
L'implementazione potrebbe quindi apparire come:
public class UnitOfWork : IUnitOfWork
{
private readonly ITransaction _tx;
public ISessionFactory SessionFactory { get; set; }
public UnitOfWork()
{
SessionFactory = ObjectFactory.GetNamedInstance<ISessionFactory>(Keys.SessionFactoryName);
Session = SessionFactory.OpenSession();
_tx = Session.BeginTransaction();
}
public UnitOfWork(ISessionFactory sessionFactory)
{
SessionFactory = sessionFactory;
Session = SessionFactory.OpenSession();
_tx = Session.BeginTransaction();
}
public ISession Session { get; private set; }
public void Commit()
{
if (_tx.IsActive)
_tx.Commit();
}
public void Rollback()
{
_tx.Rollback();
}
}
Smaltisci semplicemente l'unità di lavoro su richiesta.