Asp.net HttpModule中的NHibernate会话和事务管理

Asp.net HttpModule中的NHibernate会话和事务管理,asp.net,nhibernate,Asp.net,Nhibernate,我在web上见过许多人在HttpModule中管理他们的NHibernate会话和事务的实现 HttpModule: 在请求开始时创建会话 将整个请求包装到事务中 在请求结束时提交事务 如果人们使用此策略,他们将如何处理以下情况: 请求进来了 从数据库检索对象 更新对象 对象验证失败 对对象的更改仍然保持不变,因为事务是在HttpModule中提交的 在上述场景中,似乎没有回滚事务的好方法。我唯一能想到的计划是: 在更新我的域对象之前,以保证成功的方式编写我的验证(将我的验证从域模型中删除) 管

我在web上见过许多人在HttpModule中管理他们的NHibernate会话和事务的实现

HttpModule:

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

  • 请求进来了
  • 从数据库检索对象
  • 更新对象
  • 对象验证失败
  • 对对象的更改仍然保持不变,因为事务是在HttpModule中提交的
  • 在上述场景中,似乎没有回滚事务的好方法。我唯一能想到的计划是:

  • 在更新我的域对象之前,以保证成功的方式编写我的验证(将我的验证从域模型中删除)
  • 管理更接近业务逻辑的事务,放弃在HttpModule中透明地执行事务的想法。(我看到不少帖子推荐这个)

  • 鉴于有这么多人似乎在使用HttpModule方法,我希望有第三种方法来管理这个场景,这是我没有想到的?

    您可以使用某种全局异常处理。现在我使用的是
    System.AppDomain.CurrentDomain.UnhandledException
    。在这个处理程序中,您需要调用
    Transaction.Rollback()
    ;另外,condsider设置一些标志(也仅在当前请求期间有效),该标志将指示您是否需要提交事务或回滚。这可以使代码更加清晰

    编辑 或者,您可以使用
    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));
        }
    

    我最近也遇到了同样的问题。我从NHibernate开始做一些项目。我的最后一种方法是在IOC中使用Autofac,在会话中使用HttpRequestScope。以及业务存储库级别上的所有事务操作。也许这不是最好的,但目前它运行良好..验证更改而不是验证应用于实体的更改要容易得多。您找到答案了吗?