簡體   English   中英

HotChocolate GraphQL 中的類型繼承

[英]Type-inheritance in HotChocolate GraphQL

當我嘗試返回從注冊類型繼承的內容時,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 沒有繼承的概念。 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 規范草案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM