首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HotChocolate GraphQL中的类型继承

HotChocolate GraphQL中的类型继承
EN

Stack Overflow用户
提问于 2021-06-22 14:45:47
回答 1查看 337关注 0票数 0

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

型号:

代码语言:javascript
复制
public interface ICar { int Wheels { get; } }
public class Car  : ICar { public int Wheels => 4; }
public class Bus : Car { }

查询:

代码语言:javascript
复制
public class MyQuery
{
    public ICar Test() { return new Bus(); }
}

启动:

代码语言:javascript
复制
services.AddGraphQLServer()
        .AddQueryType<MyQuery>()
        .AddType<Car>()
        .AddType<Bus>()

GraphQL查询:

代码语言:javascript
复制
query { 
  test {
    __typename
  } 
}

输出:

代码语言:javascript
复制
{
  "data": {
    test": {
      "__typename": "Car"
    }
  }
}   

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-22 14:55:27

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

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

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

代码语言:javascript
复制
services
    .AddGraphQLServer()
    .AddQueryType<Query>()
    .AddInterfaceType<Car>()
    .AddType<Bus>();

这将转化为:

代码语言:javascript
复制
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

热巧克力已经实施了新的2021年规范草案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68078727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档