如何在 .NET 中使用 Hot Chocolate 扩展 GraphQL 自省类型
How can I extend the GraphQL introspection types with Hot Chocolate in .NET
在我的例子中,我想扩展 __EnumValue
内省类型以实质上携带有关枚举值的附加信息。如何向内省添加其他字段。
在 Hot Chocolate 中,每种类型都可以扩展。在上面的例子中,我们想要扩展一个对象类型,它是 GraphQL 中的一个输出类型。
为了做到这一点,我们创建了一个简单的 class 并用 ExtendObjectTypeAttribute
.
注释 class
[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!
}
在我的例子中,我想扩展 __EnumValue
内省类型以实质上携带有关枚举值的附加信息。如何向内省添加其他字段。
在 Hot Chocolate 中,每种类型都可以扩展。在上面的例子中,我们想要扩展一个对象类型,它是 GraphQL 中的一个输出类型。
为了做到这一点,我们创建了一个简单的 class 并用 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!
}