当我试图返回从注册类型继承的内容时,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”。如果我删除接口并将查询的返回类型设置为"Car“,我会期望同样的行为。我很高兴听到任何关于它为什么会这样做以及如何解决这个问题的想法。
发布于 2021-06-22 14:55:27
这里的问题是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
热巧克力已经实施了新的2021年规范草案。
https://stackoverflow.com/questions/68078727
复制相似问题