【问题标题】:NHibernate ISession and automatically flushing/committing transactions in my unit of workNHibernate ISession 并在我的工作单元中自动刷新/提交事务
【发布时间】:2011-03-09 09:24:39
【问题描述】:

我创建了一个 IDbContext 对象,该对象提供给我的 IRepository 实现。 DbContext 为我的业务逻辑提供了一种根据需要创建、提交和回滚事务和提交的方法。它还传输我的 NHibernate ISession,因此我的 IRepository 的 NHibernate 实现可以访问它。

我在 Web 应用程序中使用此设置,其中每个请求创建一个 DbContext 并由所有存储库共享。在请求结束时,我处理了 ISession。

根据您对标准 NHibernate 实践的经验或知识,当我正在处理并即将关闭会话时,是否可以让我的 DbContext 刷新并自动提交任何未完成的事务(前提是没有错误)?

【问题讨论】:

    标签: nhibernate session dispose unit-of-work


    【解决方案1】:

    是的,至少我上次检查时,我相信这是 S#arp 架构中使用的架构。我认为这在逻辑上也是有道理的——如果没有任何错误,你为什么不想将所有内容都提交到数据库中?

    【讨论】:

    • 是的,一开始看起来很简单,但正如 Jamie Idle 指出的那样,在游戏中智能地处理错误可能是相当晚的。我认为最好的答案在于(出于我的特定目的)刷新和提交打开的事务,但遵循严格的模式,即捕获显式事务中的错误,回滚事务,并以其他方式处理错误。
    【解决方案2】:

    这是一种常见的做法,当然是可以接受的,但我不赞成这样做。我认为它有一个明显的缺点,即请求的结束来不及执行有意义的异常处理。我更喜欢在页面上处理事务,以便我可以捕获异常并在那里处理它们。事实上,如果当前 ISession 有一个打开的事务,我会在 EndRequest 处理程序中抛出一个异常。

    【讨论】:

    • 在一种情况下,我可以看到让 DbContext 最终管理延迟事务的价值,这就是一系列不同的组件与会话和当前事务一起工作的地方(我们总是有至少一个事务)一个接一个地执行。例如,安全层可能会检查角色,然后定制引擎加载个人设置,然后处理请求的内容,最后记录任何审计。不过,我确实明白你的意思,而且我更希望我们处理显式交易,呃...明确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多