ASP.NET 中的 FluentNHibernate 会话管理

Posted

技术标签:

【中文标题】ASP.NET 中的 FluentNHibernate 会话管理【英文标题】:FluentNHibernate Session Management in ASP.NET 【发布时间】:2009-09-15 18:10:08 【问题描述】:

NHibernate 新手(我的免责声明)。我遇到了一个类似且有趣的article regarding MVC,但是,我更想知道在通用 Web 应用程序中管理 NHibernate 会话的一般最佳实践是什么。

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

Creating a common generic and extensible NHiberate Repository

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

Conversation Per Business Transaction using PostSharp and IoC

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

【讨论】:

“创建一个通用的通用和可扩展的 NIBerate 存储库”是一本很好的读物。

以上是关于ASP.NET 中的 FluentNHibernate 会话管理的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 5/ASP.NET Core 1 中的关注点分离和 n 层架构

ASP.NET MVC 中的 ASP.NET AJAX 与 jQuery

有没有办法让 Asp.net 零公共站点(Asp.net MVC)中的实时登录用户?

更改 ASP.NET SPA 模板中的 ASP.NET 标识代码的原因?

ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异

如何仅为 ASP.NET 5 (ASP.NET Core) 中的受保护操作添加令牌验证