我需要一些关于我即将对我们的网络应用进行重构的见解和想法。
我们最初通过使用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。
我的问题是:
非常感谢任何指针!
答案 0 :(得分:1)
您需要一个应用程序错误处理程序来处理异常处理。
附加调试器并查找。
可能不是(尽管这是我的文章)。它不适用于RenderAction。最好使用IoC容器来控制连接的生命周期。