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

我遇到过 洞穴 项目,但我开始意识到似乎有几个不同的方向可以采取。我知道这可能不符合我的最佳利益 创建一个新的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 的交互。

创建一个通用的、可扩展的 NHirate 存储库

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

使用 PostSharp 和 IoC 进行每个业务事务的对话

如果我今天要写这篇文章,我不会再使用 PostSharp 来处理项目中的 AOP(面向方面​​编程)代码,我要么使用 临甫AOP 或者另一个框架来进行AOP交互。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top