Monorail、nhibernate和每请求会话模式

Monorail、nhibernate和每请求会话模式,nhibernate,castle-monorail,session-per-request,Nhibernate,Castle Monorail,Session Per Request,我需要一些关于我将要对我们的web应用程序进行重构的见解和想法 我们最初使用NHibernate和ActiveRecord的每请求会话模式,在HttpApplication中使用On_BeginRequest/On_EndRequest来创建和处理会话。后来,我们意识到,任何与DB相关的异常都被抛出了monorail上下文之外,这意味着我们的救援没有起作用。另一个副作用是,我们没有选择在任何操作中完全跳过NHibernate会话的创建,这在某些情况下是可取的 因此,我们重写了它,在基础控制器的I

我需要一些关于我将要对我们的web应用程序进行重构的见解和想法

我们最初使用NHibernate和ActiveRecord的每请求会话模式,在HttpApplication中使用On_BeginRequest/On_EndRequest来创建和处理会话。后来,我们意识到,任何与DB相关的异常都被抛出了monorail上下文之外,这意味着我们的救援没有起作用。另一个副作用是,我们没有选择在任何操作中完全跳过NHibernate会话的创建,这在某些情况下是可取的

因此,我们重写了它,在基础控制器的Initialize()/Contextualize()中创建会话,并在基础控制器的Dispose()中释放它们。我们还可以在rescue控制器中回滚会话,以防止对数据库进行任何半写式更改。到目前为止,一切顺利。在Dispose()中执行此操作的原因是,我们希望它在视图渲染过程中始终有效,因为延迟加载的原因以及需要获取会话的viewcomponents(我们可以切换到viewcomponents的工作单元,但它们似乎没有Dispose()…)

然而,我遇到了一些死锁问题,我们在DB中开始了没有回滚或提交的事务,我无法解决它,主要是因为我们用这种方法造成了混乱

所以我发现了这篇文章:

我想,“过滤器,我们也可以在MonoRail中使用它!”因为它可以在渲染前和渲染后起作用

我的问题是:

  • 如果过滤器中发生异常,会发生什么情况
  • 即使在操作或渲染中发生异常,AfterRendering也会激发吗
  • 你会推荐这种方法吗?如果不是,你的建议是什么
  • 非常感谢任何指点

  • 您需要一个应用程序错误处理程序来处理异常

  • 附加调试器并查找

  • 可能不会(尽管这是我的文章)。它不适用于渲染。最好使用IoC容器来控制连接的生存期


  • 您是否尝试过使用NHibernate工具?我们正在使用ActiveRecordFacility,但我对TransactionScope的方式感到不舒服,因为我不知道创建或处置的会话。我宁愿有自己的包装器,它使用sessionFactory并根据需要创建会话。我希望能够在同一个包装器中实现“每请求会话”和“工作单元”模式。在这种情况下,NHibernate设施将如何帮助我?抱歉,没有提到ActiveRecord。是的,要么是ActiveRecordFacility要么是NHibernateFacility,不是两者都有。至于事务,您是否尝试过自动事务管理工具?我知道我们已经尝试过,但在配置中我看不到任何提及,所以我猜我们已经删除了它。然而,我试图避免太多的黑魔法,因为我觉得我们已经失去了对我们的会议实际流程的跟踪。我们还希望从活动记录迁移出去。