架构
架构为标准 mutation 和嵌套 mutation 使用单一代码来源

为标准 mutation 和嵌套 mutation 使用单一代码来源

GraphQL 服务器支持两种行为:

  1. 标准的 mutation 行为(默认)
  2. 嵌套 mutation(可选启用)

因此,默认情况下会暴露 QueryRootMutationRoot 类型,而在嵌套 mutation 模式下则切换为暴露单一的 Root 类型。

在提供解析器时,我们不希望为每种方案各自提供一个解析器。更好的做法是:用于解析 Root 字段的同一个解析器,也能解析 QueryRootMutationRoot 的字段。

实现细节

服务器使用名为 FieldResolver 的对象来解析字段,使用名为 MutationResolver 的对象来执行实际的 mutation。同一个 MutationResolver 对象可以被实现不同字段的多个 FieldResolvers 引用,因此代码只需实现一次,便可在多处复用,遵循 SOLID 原则。

字段是否为 mutation,取决于 FieldResolver 是否通过 resolveFieldMutationResolverClass 函数为该字段声明了 MutationResolver 对象。

例如,字段 Root.replyComment 提供了 AddCommentToCustomPostMutationResolver 对象。同一个对象也被字段 Comment.reply 所使用

此外,在编写 FieldResolver 时,根字段仅被添加到 Root 类型。对于标准 GraphQL 行为,服务器可以获取此配置,并根据字段是否为 mutation非 mutation,自动将其添加到 MutationRootQueryRoot

因此,由于我们对支撑标准行为和嵌套 mutation 的代码使用了单一来源,无需额外工作即可执行包含嵌套 mutation 的 query。