HotChocolate GraphQL 中的类型继承

Posted

技术标签:

【中文标题】HotChocolate GraphQL 中的类型继承【英文标题】:Type-inheritance in HotChocolate GraphQL 【发布时间】:2021-09-05 18:18:36 【问题描述】:

当我尝试返回从注册类型继承的东西时,HotChocolate 查询似乎总是返回基类。示例:

型号:

public interface ICar  int Wheels  get;  
public class Car  : ICar  public int Wheels => 4; 
public class Bus : Car  

查询:

public class MyQuery

    public ICar Test()  return new Bus(); 

启动:

services.AddGraphQLServer()
        .AddQueryType<MyQuery>()
        .AddType<Car>()
        .AddType<Bus>()

GraphQL 查询:

query  
  test 
    __typename
   

输出:


  "data": 
    test": 
      "__typename": "Car"
    
  
   

我希望输出中的“__typename”是“Bus”。如果我删除接口并将查询的返回类型设置为“汽车”,我会期待相同的行为。我很高兴听到任何关于它为什么会出现这种行为以及如何解决这个问题的想法。

【问题讨论】:

【参考方案1】:

这里的问题是 GraphQL 没有继承的概念。 GraphQL 对象类型可以实现接口。 GraphQL 接口也可以实现接口。

因此,在这种情况下,GraphQL 模式中没有实现 Car 的总线。您可以打印架构以验证 C# 代码是如何转换为 GraphQL 的。

您仍然可以将基类用作接口并构建某种继承树,但在这种情况下,Car 永远不能成为具体实例。

services
    .AddGraphQLServer()
    .AddQueryType<Query>()
    .AddInterfaceType<Car>()
    .AddType<Bus>();

这将转化为:

type Bus implements Car & ICar 
# shortened fro brevity 


interface Car implements ICar 
# shortened fro brevity 


interface ICar 
# shortened fro brevity 

这实际上对你的类型没有意义,但给你一个想法。

您还能在我们的 GitHub 存储库上提出问题吗?我们可能应该在这里抛出一个模式异常来暗示这个问题。

如果您想阅读有关对象类型的 GraphQL 规范,可以在此处完成: https://spec.graphql.org/draft/#sec-Objects

这里指定了接口: https://spec.graphql.org/draft/#sec-Interfaces

Hot Chocolate 已经实施了新的 2021 年规范草案。

【讨论】:

以上是关于HotChocolate GraphQL 中的类型继承的主要内容,如果未能解决你的问题,请参考以下文章

HotChocolate 突变输入类型使用 int 而不是 ID

如何在 GraphQL HotChocolate 中实现订阅?

基于 GUID 的 HotChocolate GraphQL 过滤

HotChocolate GraphQL 配置未被调用

使用Hot Chocolate创建ASP.NET Core GraphQL服务

如何在 Resolver 中拦截 GraphQL Hotchocolate Banana Cake Pop 查询