当我使用 autofac 时,我使用相同的容器作用域方法,但不是将相同的会话传递给我的存储库/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 环境,并有意识地决定事务与 Web 请求相关联。因此,每个 Web 请求模式的事务。
因此,我可以在 IHttpModule 中执行此错误处理代码:
void context_Error(object sender, System.EventArgs e)
{
_containerProvider.RequestContainer.Resolve<IUnitOfWork>().Rollback();
}
我还没有仔细研究过 NHibernate.Burrow,但我确信那里有一些东西可以完成大部分工作。