【问题标题】:Is there a way to implement a transaction-per-request middleware when using Hot Chocolate?使用 Hot Chocolate 时,有没有办法实现按请求事务处理的中间件?
【发布时间】:2020-09-15 15:00:12
【问题描述】:

我们的团队已经在我们的 aspnet 核心应用中实现了事务中间件。在请求开始时,我们开始一个事务,然后委托给下一个中间件。如果发生任何未处理的异常,我们将回滚事务 - 否则我们提交。不幸的是,这似乎不适用于热巧克力。它似乎在内部处理异常。我们可以检查什么(在 aspnet 核心上下文中)以确定是否有任何未处理的异常?

【问题讨论】:

    标签: hotchocolate


    【解决方案1】:

    在 V11 中,这种方法存在一些问题。 v11 中的解析器是并行执行的。因此,如果您想共享数据库上下文或其范围,您将遇到并发问题。

    您可以在此处阅读有关 ef 和 HotChocolate 的更多信息: https://chillicream.com/docs/hotchocolate/integrations/entity-framework/

    在 GraphQL 中,您实际上只需要突变中的事务范围。 突变只允许作为顶级字段

    mutation {
       updateUserName(input: {id:1233, name:"foo"}) {
          errors {
             message
          }
          user {
              username
          }
       }
    }
    

    这样的事情无效

    mutation {
       updateUser(id:1233) {
          name(value: "foo") {
             value 
          }
       }
    }
    

    由于只有顶级字段会产生副作用,您可以在那里创建您的事务范围。 如果不想重复,你甚至可以为它定义一个中间件:

    https://github.com/ChilliCream/graphql-workshop/blob/master/docs/5-understanding-middleware.md

    【讨论】:

    • 感谢 Pascal 的回答,您能否提供一个关于如何将中间件应用于所有突变的示例。因为我在研讨会上看到的都是应用于特定领域的中间件。
    • 不用担心 :) 你能发布一个新问题吗?我们正在努力增加对 StackOverflow 的贡献,以建立良好的常见问题解答基础。因此,如果答案作为评论丢失,那将是一个遗憾:)
    • Pascal Senn 这是我的问题:D 再次感谢 stackoverflow.com/questions/65808043/…
    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多