NHibernate会议:有多少?何时创建?什么时候关门?

NHibernate会议:有多少?何时创建?什么时候关门?,nhibernate,session,Nhibernate,Session,我在这里真的很挣扎。我试图使我的DAL程序集非常通用,以便它在webcontext、WCF和WinForms/WPF中工作。我的问题是会议 延迟加载很好,这是我真正想要的,但是在您加载对象的会话结束后,您就不能再延迟加载了。这对我来说是个大问题,因为我不知道应该在哪个范围内开始/结束会话 我见过很多人在HttpContext.Begin和End.End上启动它们,但这对我来说是不可行的,因为我不希望我的程序集链接到System.Web或绑定到HttpContext中调用 另一种选择是在整个DAL

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

延迟加载很好,这是我真正想要的,但是在您加载对象的会话结束后,您就不能再延迟加载了。这对我来说是个大问题,因为我不知道应该在哪个范围内开始/结束会话

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

另一种选择是在整个DAL组件生命周期中只保留一个会话。这种方法有哪些优点和缺点?该程序集主要用作网站中的后端,但也用于WinForms应用程序

有人吗?:)

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

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

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

就你想做的事而言,我们会做以下的

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

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

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


听起来不错。我也在想类似的事情,但如果“工作单位”可以是3倍“取款”+1倍“存款”?:)我不太明白你的确切意思。你是说他们同时取款和存钱?在这种情况下,我可能会创建一个新操作,该操作调用这两个操作,并封装在单个工作单元中。考虑工作单元的一个好方法是,它应该包装撤消一个操作所需的所有内容,这样您就可以执行单个工作单元。Rollback()非常有意义。我只是担心我最终会得到大量的工作单位。这与您的经验有什么关系?在我们的系统中,每个线程一次只允许一个工作单元。我们也是基于WCF的,所以将UnitOfWorkContext属性添加到OperationContext并不是什么大事。