单轨,nhibernate和每个请求会话模式

时间:2010-12-30 09:59:01

标签: nhibernate castle-monorail session-per-request

我需要一些关于我即将对我们的网络应用进行重构的见解和想法。

我们最初通过使用HttpApplication中的On_BeginRequest / On_EndRequest来创建和处置会话,使用NHibernate和ActiveRecord的每个请求会话模式。后来,我们意识到任何与数据库相关的异常都被抛到我们的单轨环境之外,这意味着我们的救援没有开始。作为另一个副作用,我们没有选择完全跳过任何NHibernate会话的创建行动,在某些情况下是可取的。

所以我们重新编写它以在我们的基本控制器中的Initialize()/ Contextualize()中创建会话,并将它们放置在我们的基本控制器的Dispose()中。我们还在我们的救援控制器中回滚会话,以防止对DB进行任何一半的书面更改。到现在为止还挺好。在Dispose()中执行此操作的原因是因为我们希望它通过视图呈现,因为延迟加载原因以及需要获取会话的viewcomponents(我们可以切换到工作单元) viewcomponents,但它们似乎没有Dispose()...)

然而,我遇到了一些死锁问题,我们已经开始在数据库中进行交易而没有回滚也没有提交,我无法理解它,主要是因为我们用这个弄乱了方法......

所以我发现了这篇文章:http://hackingon.net/post/NHibernate-Session-Per-Request-with-ASPNET-MVC.aspx

我想,“过滤器,我们也可以在MonoRail中使用它!”,因为它可以启动BeforeAction和AfterRendering。

我的问题是:

  1. 如果在过滤器中发生异常会怎样?
  2. 即使在动作或渲染中发生异常,AfterRendering会激活吗?
  3. 你会推荐这种方法,如果没有,你的建议是什么?
  4. 非常感谢任何指针!

1 个答案:

答案 0 :(得分:1)

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

  2. 附加调试器并查找。

  3. 可能不是(尽管这是我的文章)。它不适用于RenderAction。最好使用IoC容器来控制连接的生命周期。