2012-07-31 72 views
1

我想设置NHibernate来处理我的会议每个Web请求。当我使用任何存储库时,我有一个项目可以初始化我的会话。我想知道每个Web请求管理会话的最佳方式。由于我的架构已解耦,因此我想避免在我的Web项目中打开会话并关闭会话。有没有一种好的方法来处理这个问题,而不需要Web项目来了解NHibernate的存在?在洋葱架构管理NHibernate会话

这是我的请求流:

的Web请求 - > ASP.NET MVC 3 - >控制器 - >服务 - >库(在会议) - > NHibernate的 - >数据库 - >返回MVC进出。

+0

实现的session-per-请求,但它的会话per-(HTTP)请求......为什么你要隐藏,从网络项目? – dotjoe 2012-07-31 18:02:11

回答

2

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

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

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

+0

我认为在这一点上滚动我自己是我最好的选择。我已经将我的架构基于此:http://blog.tonysneed.com/2011/10/08/peeling-back-the-onion-architecture,但我不确定如何将其插入SessionHelper类I来自该页面上的来源。我注入我的连接字符串到SessionHelper类btw。我确实认为HttpModule是要走的路。你能提供更多的帮助吗? – 2012-08-01 21:40:49

+0

我真的会建议从一开始就使用DI容器。你当然可以建立你自己的HttpModule,或者你选择的任何方法。如果你之前没有使用过DI,那么就有一些学习曲线,但它一点都不坏。 DI是一件非常明智的事情,它可以帮助你将自己编程到一个角落。它使一切松耦合,这是洋葱建筑的一个重点。有大量有关使用DI与MVC和NHibernate的博客文章。祝你好运! – 2012-08-02 15:33:22

+0

我有我的整个框架使用Ninject作为我的DI。使用你的答案,我能够准确理解我在找什么。我结束了这个http://ben.onfabrik.com/posts/yet-another-session-per-request-post作为我为每个请求设置会话的基础。我目前正在学习如何让Ninject注入ActionFilters,这样我就可以注入我的UnitOfWork实现。再次感谢您的意见和帮助! – 2012-08-02 16:02:27