我正在尝试设置NHibernate来处理每个Web请求的会话。我有一个项目,在使用我的任何存储库时初始化我的Session。我想知道每个Web请求管理会话的最佳方法。因为我的架构是分离的,所以我想避免在我的Web项目中打开会话和关闭会话。有没有一种好的方法来处理这个问题而不需要Web项目知道NHibernate的存在?
这是我的请求流程:
网络请求 - > ASP.NET MVC 3 - >控制器 - >服务 - >存储库(打开会话) - > NHibernate - >数据库 - >回到MVC并退出。
答案 0 :(得分:2)
看看S#arp架构。它是一个包装NHibernate并为您提供此功能的框架,以及其他一些功能。您也可以使用像Castle Windsor或Ninject这样的依赖注入容器来完成此操作。 (S#arp使用Castle Windsor)。
如果您想自己完成此操作,则需要创建HttpModule
以在每个Web请求的开头和结尾为您打开和关闭会话。在请求开始时,模块将打开一个会话,并将其存放在HttpContext.Items
中,这是每个Web请求存储。您的存储库将在处理请求时从此处获取会话。 (对于干净的设计,创建存储库使用的接口ISessionManager
,以及访问每个请求存储的实现。然后它可以进行单元测试。)最后,模块将刷新并关闭会话在请求结束时。我曾经在一个NHibernate项目上做过一次,尽管它很有教育意义,但还是做了很多工作。
S#arp是一个庞大的框架,它决定了很多应用程序结构。如果你不想走那么远的地方,可以看看温莎城堡,为你干净利落地抽象出来。您需要做的(或多或少)是配置容器以使用每个请求的NHibernate会话对象作为构造函数参数来实例化存储库。如果你真的想学习如何,建立你自己的HttpModule,但我建议在生产中使用一个框架。
答案 1 :(得分:0)
以下是一篇很棒的文章,介绍如何使用IoC容器(Castle Windsor)http://blog.xelibrion.com/journal/2011/4/16/nhibernate-session-management-in-aspnet-mvc-application.html
实现每个请求的会话