HttpModule中的NHibernate会话和事务管理

Bro*_*nie 9 asp.net nhibernate

我在网上看到很多人在HttpModule中管理他们的NHibernate会话和事务.

HttpModule:

  1. 在请求开始时创建会话
  2. 在事务中包装整个请求
  3. 在请求结束时提交事务

如果人们使用此策略,他们如何处理以下场景:

  1. 请求进来
  2. 从数据库中检索对象
  3. 更新对象
  4. 对象验证失败
  5. 对象的更改仍然存在,因为事务是在HttpModule中提交的.

在上面的场景中似乎没有好的方法来回滚事务.我能想出的唯一计划是:

  1. 以更新我的域对象之前保证成功的方式编写我的验证(从我的域模型中取出我的验证).
  2. 管理我的事务更接近我的业务逻辑,并抛弃在HttpModule中透明地执行它的想法.(我看过不少帖子推荐这个)

看到有这么多人似乎在使用HttpModule方法,我希望有第三种管理这种情况的方法,我没想过?

Res*_*uta 2

您可以使用某种全局异常处理。现在我正在使用System.AppDomain.CurrentDomain.UnhandledException. 在此处理程序中,您需要调用Transaction.Rollback(); 并且还考虑设置一些标志(也仅在当前请求期间存在),该标志将指出您是否需要提交事务或回滚。这样可以让代码更加清晰。

编辑 或者您可以使用错误事件HttpApplication

public class HelloWorldModule : IHttpModule
{
    void Init(HttpApplication application)
    {
        application.BeginRequest += 
            (new EventHandler(this.Application_BeginRequest));
        application.EndRequest += 
            (new EventHandler(this.Application_EndRequest));
        //this is it
        applicaiton.Error +=
            (new EventHandler(this.Application_Error));
    }
Run Code Online (Sandbox Code Playgroud)