我使用 nHibernate 进行 ORM,使用 Ninject 进行 IoC。
我根据某个自定义范围(您可以假设是针对每个请求)创建 nHibernate 会话。
我在激活时开始交易。
我在停用时提交事务。
问题是,如果在请求期间发生异常,我想回滚事务而不是提交它。知道如何检测(以干净的方式,最有可能使用 Ninject Context)发生异常吗?
注意:我不关心提交时可能发生的异常,我可以在下面的代码中捕获这些异常并轻松返回。
protected void BindWithSessionWrapper<T>(Func<IContext, T> creationFunc) where T : ISessionWrapper
{
Bind<T>().ToMethod(creationFunc)
.InScope(x => new NinjectCustomScope()) // work in progress !!!
.OnActivation(t => t.Session.BeginTransaction(IsolationLevel.ReadCommitted))
.OnDeactivation((c, t) =>
{
t.Session.Transaction.Commit();
t.Session.Dispose();
});
}
Update:
我遵循了@BatteryBackupUnit 的建议。
所以我将以下内容添加到错误事件处理程序中:
Error += (s, e) =>
{
HttpContext.Current.Items["ErrorRaised"] = true;
};
我将 OnDeactivation 修改为如下所示:
OnDeactivation(t =>
{
if ((bool?)HttpContext.Current.Items["ErrorRaised"] == true)
t.Session.Transaction.Rollback();
else
t.Session.Transaction.Commit();
t.Session.Dispose();
});
它工作得很好,但是如果 Ninject 在发生异常时通过在上下文中设置一个标志来解决这个问题,那就更好了:)