【问题标题】:Type-inheritance in HotChocolate GraphQLHotChocolate 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”。如果我删除接口并将查询的返回类型设置为“汽车”,我会期待相同的行为。我很高兴听到任何关于它为什么会出现这种行为以及如何解决这个问题的想法。

【问题讨论】:

    标签: graphql hotchocolate


    【解决方案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 年规范草案。

    【讨论】:

      猜你喜欢
      • 2022-10-19
      • 2022-06-16
      • 2010-11-08
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      相关资源
      最近更新 更多