使用 Hot Chocolate 时,有没有一种方法可以实现按请求进行交易的中间件?

Is there a way to implement a transaction-per-request middleware when using Hot Chocolate?

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

对于 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