NHibernate会议:多少个?何时创造?什么时候关闭?

时间:2009-06-10 19:11:09

标签: nhibernate session

我真的在这里与NHibernate挣扎。我试图保持我的DAL程序集非常通用,以便它在webcontext,WCF和WinForms / WPF中工作。我的问题是会议。

延迟加载是好的,我真正想要的东西,但在你加载对象的会话关闭后,你不能再懒加载了。这对我来说是一个巨大的交易,因为我不知道我应该在哪个范围开始/结束我的会话。

我见过很多人在HttpContext.Begin上启动它们并在.End上结束它们,但这对我来说是不可行的,因为我不希望我的程序集链接到System.Web或被绑定到在HttpContext中调用。

另一个选择是为整个DAL-assembly生命周期保留一个会话。这种方法有哪些优点和缺点?该程序集将主要作为网站的后端工作,但也为WinForms应用程序做一些工作。

任何接受者? :)

[编辑] 我的另一个选择是编写我自己的延迟加载代理集合,这反过来会打开一个新会话并获取集合应该包含的任何数据。对这种方法有何评论?

1 个答案:

答案 0 :(得分:3)

在我们的系统中,我们有一个工作单元的概念。我们的工作单位是针对该系统的单一操作。例如,从账户中提取资金或将资金存入账户将是一个单一的工作单元。

工作单元类包装了NHibernate会话(以及其他一些东西),然后我们的存储库对当前的工作单元(通过线程存储)起作用。

就你要做的事情而言,我们会做以下事情......

  • 对于WCF,我们有一个UnitOfWorkContext属性,我们将该属性应用于负责开始/结束工作单元的操作。

  • 对于WinForms,我们只需让演示者开始/结束工作单元

  • 对于WebContext,我们会在HttpContext.Begin和.End中执行相同的操作