Quando uso autofac io uso lo stesso metodo contenitore di ambito, ma invece di passare la stessa sessione per il mio repository/oggetti DAO mi passano un UnitOfWork che è il contenitore ambito. L'Unità di lavoro ha questo nel costruttore.
private readonly ISession _session;
private ITransaction _transaction;
public UnitOfWork(ISession session)
{
_session = session;
_transaction = session.BeginTransaction();
}
E il Dispose è:
public void Dispose()
{
try
{
if (_transaction != null &&
!_transaction.WasCommitted &&
!_transaction.WasRolledBack)
_transaction.Commit();
_transaction = null;
}
catch (Exception)
{
Rollback();
throw;
}
}
Io sono (ab) utilizzando la roba di smaltimento deterministica in autofac al fine di gestire questo, e ben mi po 'come esso.
L'altra cosa è che fondamentalmente sto solo prendendo di mira un ambiente ASPNet e ho preso una decisione consapevole che una transazione è legata a una richiesta web. Quindi una transazione per modello di richiesta web.
A causa di ciò posso fare questo codice di gestione in un IHttpModule errore:
void context_Error(object sender, System.EventArgs e)
{
_containerProvider.RequestContainer.Resolve<IUnitOfWork>().Rollback();
}
non ho dato un'occhiata a NHibernate.Burrow troppo da vicino, ma sono sicuro che ci sia qualcosa là che fa la maggior parte di questo.
Mi piace la soluzione. Tuttavia, un'altra domanda è su quali metodi dovrei applicare [Transazione]? Secondo questo http://nhprof.com/Learn/Alert?name=DoNotUseImplicitTransactions sembra che dovrei sempre avere una transazione se ho una sessione, tuttavia questa soluzione mi richiede di aggiungere manualmente [Transaction] ovunque sia usata la sessione. –
Controllare la versione modificata. Probabilmente saprai come modificarlo da lì. È anche possibile saltare l'attributo [Transazione] e avviare sempre la transazione. È la vostra scelta. Avevo bisogno dell'attributo, perché a volte avevo bisogno di fare 2 cose in diverse transazioni. ho fatto in questo modo: // attributo Nessuna transazione CallThis pubblici virtuali vuoto() { TranS1(); // commit Trans2(); // impegna } [transazione] pubblico virtuale vuoto Trans1() {} [transazione] pubblico virtuale vuoto trans2() {} – dmonlord
Ci può spiegare il caso d'uso per due operazioni? Questo è importante perché se potessi incontrare un caso d'uso simile, vedrò il problema in modo diverso. –