NHibernate 新手(我的免责声明)。我遇到了一篇关于 MVC的类似且有趣的文章,但是,我更好奇在通用 Web 应用程序中管理 NHibernate 会话的一般最佳实践是什么。
我遇到了Burrow项目,但我开始意识到似乎有几个不同的方向可供选择。我知道每次我需要接触数据库时创建一个新的 SessionFactory可能不符合我的最佳利益,所以我对社区如何管理会话感兴趣。你用洞穴吗?您是否将 SessionFactory 包装在单例中?
任何方向或见解总是非常感谢。
NHibernate 新手(我的免责声明)。我遇到了一篇关于 MVC的类似且有趣的文章,但是,我更好奇在通用 Web 应用程序中管理 NHibernate 会话的一般最佳实践是什么。
我遇到了Burrow项目,但我开始意识到似乎有几个不同的方向可供选择。我知道每次我需要接触数据库时创建一个新的 SessionFactory可能不符合我的最佳利益,所以我对社区如何管理会话感兴趣。你用洞穴吗?您是否将 SessionFactory 包装在单例中?
任何方向或见解总是非常感谢。
要直接回答您的问题,您的ISessionFactory
对象应该是单例。您可以通过编程方式(即通过将其包装在 C# 单例中)或通过在您的 IoC 容器中配置它来执行此操作。
至于会话,Burrow 看起来不错,但 Web 应用程序中最主要和最简单的会话模式 - OpenSessionInView - 是开箱即用的 NHibernate 2.0.0。也就是说,您的数据访问代码调用ISessionFactory.GetCurrentSession()
而不是ISessionFactory.OpenSession()
. 然后,您通过指定的实现来说明如何管理工厂的当前会话ICurrentSessionContext
。NHibernate 提供了两个开箱即用的用于将会话与 Web 请求对齐。这在文档中称为“上下文会话”。
毫无疑问,更复杂的 Web 应用程序可能需要更持久的对话以及复杂的延迟加载等,但对于标准的 Web 应用程序来说,NHibernate 上下文会话就足够了。
我就这个主题写了一系列关于 NHibernate / Fluent NHibernate 数据访问模式的博客文章。
我推荐的第一个是抽象 NHibernate 的交互。
然后为了处理会话管理,我实现了“每个业务会话的会话”模式,它不是在单个页面请求的生命周期中存在一个 NH 会话,这是一个常见的页面请求,它存在于一系列事件中,比如一个允许你的页面对表单进行大量编辑,然后在最后将它们全部永久应用或取消它们。
如果我今天要写这篇文章,我不会再使用 PostSharp 来处理我的项目中的 AOP(Aspect Orientated Programming)代码,我会使用Linfu.AOP或其他框架来进行 AOP 交互。