【问题标题】:NHibernate sessions: How many? When to create? When to close?NHibernate 会话:有多少?什么时候创建?什么时候关门?
【发布时间】:2009-06-11 03:52:51
【问题描述】:

我真的在这里与 NHibernate 苦苦挣扎。我试图让我的 DAL 程序集非常通用,以便它在 web 上下文、WCF 和 WinForms / WPF 中工作。我的问题是会话。

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

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

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

有接受者吗? :)

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

【问题讨论】:

    标签: nhibernate session


    【解决方案1】:

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

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

    就您尝试做的事情而言,我们将执行以下操作...

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

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

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

    【讨论】:

    • 听起来不错。我也在想这样的事情,但是如果“工作单元”可以是 3x“取款”+1x“存款”呢? :)
    • 不确定我是否完全理解您的意思。你的意思是他们同时取款和存款?在这种情况下,我可能会创建一个新操作,它调用这两个操作并包装在一个工作单元中。考虑工作单元的一个好方法是,它应该包含撤消一个操作所需的所有内容,以便您可以执行单个 UnitOfWork.Rollback()。
    • 非常有意义。我只是担心我最终会得到大量的工作单元。这如何应对您的体验?
    • 在我们的系统中,每个线程一次只允许一个工作单元。我们也是基于 WCF 的,因此将 UnitOfWorkContext 属性添加到 OperationContext 并不是什么大问题。
    猜你喜欢
    • 2011-01-11
    • 2012-03-25
    • 1970-01-01
    • 2019-06-13
    • 2014-02-07
    • 2011-09-28
    • 1970-01-01
    • 2012-08-07
    • 2012-04-05
    相关资源
    最近更新 更多