3

NHibernate 新手(我的免责声明)。我遇到了一篇关于 MVC的类似且有趣的文章,但是,我更好奇在通用 Web 应用程序中管理 NHibernate 会话的一般最佳实践是什么。

我遇到了Burrow项目,但我开始意识到似乎有几个不同的方向可供选择。我知道每次我需要接触数据库时创建一个新的 SessionFactory可能不符合我的最佳利益,所以我对社区如何管理会话感兴趣。你用洞穴吗?您是否将 SessionFactory 包装在单例中?

任何方向或见解总是非常感谢。

4

2 回答 2

5

要直接回答您的问题,您的ISessionFactory对象应该是单例。您可以通过编程方式(即通过将其包装在 C# 单例中)或通过在您的 IoC 容器中配置它来执行此操作。

至于会话,Burrow 看起来不错,但 Web 应用程序中最主要和最简单的会话模式 - OpenSessionInView - 是开箱即用的 NHibernate 2.0.0。也就是说,您的数据访问代码调用ISessionFactory.GetCurrentSession()而不是ISessionFactory.OpenSession(). 然后,您通过指定的实现来说明如何管理工厂的当前会话ICurrentSessionContext。NHibernate 提供了两个开箱即用的用于将会话与 Web 请求对齐。这在文档中称为“上下文会话”。

毫无疑问,更复杂的 Web 应用程序可能需要更持久的对话以及复杂的延迟加载等,但对于标准的 Web 应用程序来说,NHibernate 上下文会话就足够了。

于 2009-09-15T22:16:26.923 回答
2

我就这个主题写了一系列关于 NHibernate / Fluent NHibernate 数据访问模式的博客文章。

我推荐的第一个是抽象 NHibernate 的交互。

创建一个通用的通用和可扩展的 NIBerate 存储库

然后为了处理会话管理,我实现了“每个业务会话的会话”模式,它不是在单个页面请求的生命周期中存在一个 NH 会话,这是一个常见的页面请求,它存在于一系列事件中,比如一个允许你的页面对表单进行大量编辑,然后在最后将它们全部永久应用或取消它们。

使用 PostSharp 和 IoC 的每个业务交易的对话

如果我今天要写这篇文章,我不会再使用 PostSharp 来处理我的项目中的 AOP(Aspect Orientated Programming)代码,我会使用Linfu.AOP或其他框架来进行 AOP 交互。

于 2009-09-15T19:02:18.467 回答