如何在 .NET 中使用 Hot Chocolate 扩展 GraphQL 自省类型

问题描述

在我的例子中,我想扩展 __EnumValue 内省类型以实质上携带有关枚举值的附加信息。如何向内省添加其他字段。

解决方法

在 Hot Chocolate 中,每种类型都可以扩展。在上面的例子中,我们想要扩展一个对象类型,它是 GraphQL 中的输出类型。

为了做到这一点,我们创建了一个简单的类并使用 ExtendObjectTypeAttribute 注释该类。

[ExtendObjectType("__EnumValue")]
public class EnumTypeExtension
{
    public string GetAdditionalInfo([Parent] IEnumValue enumValue) =>
        enumValue.ContextData["additionalInfo"].ToString();
}

请注意,您可以注入原始类型具有的任何信息。在本例中,我们注入 __EnumValue 类型的运行时值以公开其他信息。

以上转换为以下 SDL:

extend type __EnumValue {
  additionalInfo: String!
}

最后,我们需要向架构注册我们的类型扩展。

services
    .AddGraphQL()
    .AddQueryType<QueryType>()
    .AddTypeExtension<EnumTypeExtension>();

之后,我们可以这样查询:

query {
  __type(name: "MyEnum") {
    enumValues {
       additionalInfo
    }
  }
}

对此有一点警告,随着规范的推进,它可能会在自省中引入可能与您的领域发生冲突的新领域。因此,实际引入一个字段 extensions 并将您的扩展字段放在那里是一个很好的做法。这遵循了 GraphQL 中请求和响应的扩展方式。

type EnumValueExtensions {
  additionalInfo: String!
}

extend type __EnumValue {
  extensions: EnumValueExtensions!
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...