Когда я использую autofac, я использую тот же метод области контейнера, но вместо того, чтобы передать тот же сеанс моим объектам Repository / DAO, я передаю UnitOfWork, который является областью контейнера. Единица работы имеет это в конструкторе.
private readonly ISession _session;
private ITransaction _transaction;
public UnitOfWork(ISession session)
{
_session = session;
_transaction = session.BeginTransaction();
}
И распоряжение:
public void Dispose()
{
try
{
if (_transaction != null &&
!_transaction.WasCommitted &&
!_transaction.WasRolledBack)
_transaction.Commit();
_transaction = null;
}
catch (Exception)
{
Rollback();
throw;
}
}
Я (ab) использую детерминированный материал для удаления в autofac, чтобы справиться с этим, и мне это вроде нравится.
Другое дело, что я в основном ориентируюсь только на среду ASPNet и принял осознанное решение о том, что транзакция связана с веб-запросом. Таким образом, транзакция по шаблону веб-запроса.
Из-за этого я могу сделать этот код обработки ошибок в модуле IHttpModule:
void context_Error(object sender, System.EventArgs e)
{
_containerProvider.RequestContainer.Resolve<IUnitOfWork>().Rollback();
}
Я не взглянул на NHibernate.Burrow слишком внимательно, но я уверен, что есть кое-что, что делает большую часть этого.