1

我正在尝试设置 NHibernate 来处理每个 Web 请求的会话。我有一个项目在使用我的任何存储库时初始化我的会话。我想知道管理每个 Web 请求的会话的最佳方式。因为我的架构是解耦的,所以我想避免在我的 Web 项目中打开会话并关闭会话。有没有一种好方法来处理这个问题,而不需要 web 项目知道 NHibernate 的存在?

这是我的请求流程:

Web 请求 -> ASP.NET MVC 3 -> 控制器 -> 服务 -> 存储库(打开会话) -> NHibernate -> 数据库 -> 返回 MVC 并退出。

4

2 回答 2

2

看看 S#arp 架构。它是一个包装 NHibernate 并为您提供此功能的框架,以及一些其他功能。您也可以使用 Castle Windsor 或 Ninject 等依赖注入容器来执行此操作。(S#arp 使用温莎城堡)。

如果您想自己执行此操作,则需要HttpModule在每个 Web 请求的开始和结束时为您创建一个打开和关闭会话。在请求开始时,该模块将打开一个会话,并将其隐藏在 中HttpContext.Items,这是每个 Web 请求的存储。您的存储库将在处理请求时从此处获取会话。(对于干净的设计,创建ISessionManager存储库使用的接口,以及访问每个请求存储的实现。然后它是可单元测试的。)最后,模块将在请求结束时刷新并关闭会话。我曾经在一个 NHibernate 项目中这样做过,虽然它具有教育意义,但工作量很大。

S#arp 是一个大型框架,它决定了许多应用程序结构。如果您不想走那么远,请查看温莎城堡,为您清晰地抽象出来。您需要做的(或多或少)是配置容器以使用每个请求的 NHibernate 会话对象作为构造函数参数来实例化存储库。如果你真的想学习如何,构建自己的 HttpModule,但我建议在生产中使用框架。

于 2012-07-31T18:36:49.250 回答
0

这是一篇很棒的文章,如何使用 IoC 容器(温莎城堡)实现每请求会话http://blog.xelibrion.com/journal/2011/4/16/nhibernate-session-management-in-aspnet-mvc-application .html

于 2012-08-01T12:15:56.823 回答