我需要一些关于我即将对我们的网络应用程序进行重构的见解和想法。
我们最初通过使用 HttpApplication 中的 On_BeginRequest / On_EndRequest 来使用 NHibernate 和 ActiveRecord 的 session-per-request 模式来创建和处置会话。后来,我们意识到任何与 DB 相关的异常都被抛出了我们的 monorail-context,这意味着我们的救援没有开始。作为另一个副作用,我们没有选择完全跳过任何 NHibernate 会话的创建行动,这在某些情况下是可取的。
所以我们重写它以在我们的基本控制器的 Initialize() / Contextualize() 中创建会话,并将它们放置在我们的基本控制器的 Dispose() 中。我们还在救援控制器中回滚会话,以防止对数据库进行任何一半的写入更改。到目前为止,一切都很好。在 Dispose() 中这样做的原因是因为我们希望它能够通过视图渲染,因为延迟加载的原因以及需要获取会话的视图组件(我们可以切换到工作单元viewcomponents,但它们似乎没有 Dispose()...)
但是,我遇到了一些死锁问题,我们在数据库中开始了没有回滚或提交的事务,我无法理解它,主要是因为我们用这种方法弄得一团糟。 .
所以我找到了这篇文章:http ://hackingon.net/post/NHibernate-Session-Per-Request-with-ASPNET-MVC.aspx
我想,“过滤器,我们也可以在 MonoRail 中使用它!”,因为它可以在 BeforeAction 和 AfterRendering 中发挥作用。
那么我的问题是:
- 如果过滤器中出现异常会发生什么?
- 即使在动作或渲染中发生异常,AfterRendering 也会触发吗?
- 您会推荐这种方法吗?如果没有,您的建议是什么?
任何指针都非常感谢!