使用热巧克力时,是否可以实现按请求事务中间件?

问题描述

我们的团队已在aspnet核心应用中实现了交易中间件。在请求的开始,我们开始一个事务,然后委托给下一个中间件。如果发生任何未处理的异常,我们将回滚事务-否则我们将提交。不幸的是,这似乎在Hot Chocolate中不起作用。它似乎在内部处理异常。我们可以检查一些东西(在aspnet核心环境中)以确定是否有未处理的异常吗?

解决方法

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

您可以在此处阅读有关 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