HttpModule中的NHibernate会话和事务管理

时间:2010-09-18 00:07:14

标签: asp.net nhibernate

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

HttpModule:

  1. 在请求开始时创建会话
  2. 将整个请求包装在一个事务中
  3. 在请求结束时提交交易
  4. 如果人们使用此策略,他们如何处理以下情况:

    1. 请求
    2. 从数据库中检索对象
    3. 更新对象
    4. 对象验证失败
    5. 对象的更改仍然存在,因为事务是在HttpModule中提交的。
    6. 在上面的场景中似乎没有好的方法来回滚事务。我能提出的唯一计划是:

      1. 以更新我的域对象之前保证成功的方式编写我的验证(从我的域模型中取出我的验证)。
      2. 将我的事务管理更接近我的业务逻辑,并抛弃在HttpModule中透明地执行它的想法。 (我见过很多帖子推荐这个)
      3. 看到很多人似乎都在使用HttpModule方法,我希望有第三种管理这种情况的方法,我没有想过?

1 个答案:

答案 0 :(得分: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));
    }