看看S#arp Architecture。这是一个包装NHibernate的框架,并为您提供了这个功能,以及其他一些功能。您还可以使用Castle Windsor或Ninject等依赖注入容器来执行此操作。 (S#arp使用Castle Windsor)。
如果您想自己做这件事,您需要创建一个HttpModule
以在每个Web请求的开始和结束时为您打开和关闭会话。在请求开始时,模块将打开一个会话,并将其存储在HttpContext.Items
,这是每个Web请求存储。处理请求时,您的存储库将从此处获取会话。 (对于一个干净的设计,创建一个存储库使用的接口ISessionManager
,以及一个访问每个请求存储的实现,然后它是单元可测试的)。最后,模块会在请求结束时刷新和关闭会话。我曾经在一个NHibernate项目上做过这样的工作,虽然它很有教育意义,但它的工作很多。
S#arp是一个很大的框架,它规定了很多应用程序结构。如果你不想走那么远的话,看看温莎城堡,把这些东西干净地抽象出来。所有你需要做的(或多或少)是配置容器来实例化存储库,每个请求的NHibernate会话对象作为构造参数。如果你真的想学习如何,建立你自己的HttpModule,但我建议在生产中使用一个框架。
实现的session-per-请求,但它的会话per-(HTTP)请求......为什么你要隐藏,从网络项目? – dotjoe 2012-07-31 18:02:11