gpt4 book ai didi

asp.net - 当 UnitOfWork 是整个请求时,如何最好地通知用户 NHibernate 异常?

转载 作者:行者123 更新时间:2023-12-03 07:51:40 26 4
gpt4 key购买 nike

我目前在 ASP.NET WebForms 应用程序中使用 Open Session in View 模式(改编自 Billy McCafferty 的 http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx )。过于简单地说明这里发生了什么:

  • 在请求开始时打开 NHibernate 事务
  • 在请求结束时提交(回滚任何错误)

  • 我通常通过在 Application_Error(我在其中记录、重定向到一般错误页面等)中捕获它们来处理任何异常的数据库错误,如下所示:
            ...
    if (Context != null && Context.IsCustomErrorEnabled)
    {
    Server.Transfer(ErrorPageLocation, false);
    }
    else
    {
    log.Error("Unhandled Exception trapped in Global.asax", exception);
    }

    但是对于 NHibernate,当我遇到任何 NHibernate/Database 错误时,请求执行我通常的 Server.Transfer 为时已晚(显然在请求的后期不会发生传输)错误重定向(尽管仍然会发生日志记录)。作为一个非常快速的解决方法,我在自定义 HttpModule 的 HttpApplication Context EndRequest 中完成了以下操作:
            try
    {
    // Commits any open transaction and throws after rolling back any HibernateException and closing session.
    NHibernateSessionManager.Instance.CommitTransaction();
    }
    catch (HibernateException)
    {
    HttpContext.Current.Response.Redirect(ERROR_PAGE_LOCATION);
    }
    finally
    {

    NHibernateSessionManager.Instance.CloseSession();
    }

    ...但这闻起来不仅因为我现在在我的 Web 中引用 NHibernate,而且主要是因为我确信一定有更好的方法。在发生数据库/NHibernate 错误时将用户重定向到通用错误页面的更好方法是什么使用 Global.asax.cs Application_Error 中的 Server.Transfer?更进一步,对于 Web 服务,它变得更加棘手,因为上述 hack 显然没有任何效果(并且在接收端没有抛出异常来处理 - 在我的情况下,最常见的是在客户端 ajax 调用中)。

    请告诉我我遗漏了一些明显的东西(通常在我点击提交这些问题后,明显的东西就会击中我)!

    最佳答案

    据我了解, View 模式中的打开 session 不一定意味着一个工作单元对整个请求都是开放的。我通过在我的 Controller 方法中明确定义一个工作单元来处理这个问题(在 ASP.NET MVC 中,不是 webforms,但原理是一样的)。在 Controller 方法返回之前,任何数据库事务都已提交,因此我可以在那时正确处理任何数据更新错误。即使在事务提交之后, session 仍然保持打开状态。出于我的目的, View 中的打开 session 主要用于允许在 View 阶段延迟加载相关对象。我选择这样做有两个主要原因:

  • 在将 View 呈现给响应时,我不想让任何数据库事务保持打开状态——这不是必需的,并且对于数据库事务,越短越好。
  • 使用“使用”模式,拥有一个明确的工作单元并不需要太多额外的努力

  • 在 View 阶段发生的任何 NHibernate 错误对我来说都不那么重要——事务和任何更新都已经完成,所以我可以使用通用的包罗万象的重定向错误处理程序来处理这些错误。

    关于asp.net - 当 UnitOfWork 是整个请求时,如何最好地通知用户 NHibernate 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/745761/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com