我真的在这里与NHibernate挣扎。我试图保持我的DAL程序集非常通用,以便它在webcontext,WCF和WinForms / WPF中工作。我的问题是会议。
延迟加载是好的,我真正想要的东西,但在你加载对象的会话关闭后,你不能再懒加载了。这对我来说是一个巨大的交易,因为我不知道我应该在哪个范围开始/结束我的会话。
我见过很多人在HttpContext.Begin上启动它们并在.End上结束它们,但这对我来说是不可行的,因为我不希望我的程序集链接到System.Web或被绑定到在HttpContext中调用。
另一个选择是为整个DAL-assembly生命周期保留一个会话。这种方法有哪些优点和缺点?该程序集将主要作为网站的后端工作,但也为WinForms应用程序做一些工作。
任何接受者? :)
[编辑] 我的另一个选择是编写我自己的延迟加载代理集合,这反过来会打开一个新会话并获取集合应该包含的任何数据。对这种方法有何评论?
答案 0 :(得分:3)
在我们的系统中,我们有一个工作单元的概念。我们的工作单位是针对该系统的单一操作。例如,从账户中提取资金或将资金存入账户将是一个单一的工作单元。
工作单元类包装了NHibernate会话(以及其他一些东西),然后我们的存储库对当前的工作单元(通过线程存储)起作用。
就你要做的事情而言,我们会做以下事情......
对于WCF,我们有一个UnitOfWorkContext属性,我们将该属性应用于负责开始/结束工作单元的操作。
对于WinForms,我们只需让演示者开始/结束工作单元
对于WebContext,我们会在HttpContext.Begin和.End中执行相同的操作