C# ASP.NET中的FluentNHibernate会话管理

C# ASP.NET中的FluentNHibernate会话管理,c#,nhibernate,singleton,sessionfactory,nhibernate-burrow,C#,Nhibernate,Singleton,Sessionfactory,Nhibernate Burrow,NHibernate新手(我的免责声明)。我遇到了一个类似且有趣的问题,然而,我更好奇的是,在通用web应用程序中管理NHibernate会话的一般最佳实践是什么 我遇到了这个项目,但我开始意识到似乎有几个不同的方向要走。我知道,每次我需要接触数据库时,这可能不是我最感兴趣的,所以我感兴趣的是社区如何管理会话。你用Burrow吗?您是否将SessionFactory包装在一个单例中 任何方向或见解都会受到极大的赞赏。我写了一系列关于NHibernate/Fluent NHibernate数据访问

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

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


任何方向或见解都会受到极大的赞赏。

我写了一系列关于NHibernate/Fluent NHibernate数据访问模式的博客文章

我推荐的第一种方法是抽象出NHibernate的相互作用

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


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

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

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


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

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