autofac を使用する場合、同じコンテナー スコープのメソッドを使用しますが、同じセッションをリポジトリ/DAO オブジェクトに渡す代わりに、コンテナー スコープの UnitOfWork を渡します。Unit of work のコンストラクターにはこれがあります。
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;
}
}
これを管理するために、autofac で決定論的処理を (ab) 使用しています。
もう 1 つは、基本的に ASPNet 環境のみを対象としており、トランザクションが Web 要求に関連付けられているという意識的な決定を下したことです。したがって、Web 要求パターンごとのトランザクション。
そのため、IHttpModule で次のエラー処理コードを実行できます。
void context_Error(object sender, System.EventArgs e)
{
_containerProvider.RequestContainer.Resolve<IUnitOfWork>().Rollback();
}
私は NHibernate.Burrow をあまり詳しく見ていませんが、これのほとんどを行う何かがあると確信しています。