我正在尝试将NHibernate设置为处理每个web请求的会话。我有一个项目,可以在使用我的任何存储库时初始化我的会话。我想知道如何根据每个web请求来管理我的会话。因为我的架构是解耦的,所以我希望避免在我的web项目中打开会话和关闭会话。有没有一种好的方法来处理这个问题,而不需要web项目知道NHibernate的存在?
这是我的请求流程:
Web Request -> ASP.NET MVC 3 ->控制器->服务数据库存储库(打开会话) -> NHibernate ->数据库->返回MVC并传出。
发布于 2012-08-01 02:36:49
看一看S#arp架构。它是一个框架,包装了NHibernate并为您提供了它,以及其他一些特性。你也可以使用一个依赖注入容器,比如Castle、Windsor或Ninject。(S#arp使用城堡温莎)。
如果您希望自己完成此操作,则需要创建一个HttpModule,以便在每个web请求开始和结束时为您打开和关闭会话。在请求开始时,模块将打开一个会话,并将其隐藏在HttpContext.Items中,这是每个web请求的存储。在处理请求时,您的存储库将从此处获取会话。(对于整洁的设计,创建存储库使用的接口ISessionManager,以及访问按请求存储的实现。那么它就是可单元测试的。)最后,模块将在请求结束时刷新并关闭会话。我曾经在一个NHibernate项目中这样做过一次,虽然它很有教育意义,但也有很多工作要做。
S#arp是一个大型框架,它规定了大量的应用程序结构。如果你不想走得那么远,可以看看Castle Windsor,为你干净利落地抽象出来。您所需要做的(或多或少)就是配置容器,使用每个请求的NHibernate会话对象作为构造函数参数来实例化存储库。如果您真的想了解如何构建自己的HttpModule,但我建议您在生产环境中使用框架。
发布于 2012-08-01 20:15:57
这是一篇很棒的文章,介绍了如何使用IoC容器(Castle Windsor) http://blog.xelibrion.com/journal/2011/4/16/nhibernate-session-management-in-aspnet-mvc-application.html实现会话/请求
https://stackoverflow.com/questions/11746188
复制相似问题