一步一步在AspNetCore中使用GraphQL(四)----GraphiQL類型系統

GraphQL(Graph Query Language)即圖形化查詢語言。使用GraphQL,可以將所有的業務建模爲圖。圖是將很多真實世界現象變成模型的強大工具,因爲它們和我們自然的心智模型和基本過程的口頭描述很相似。通過GraphQL,可以把我們的業務領域通過定義schema建模成一張圖;在Schema中,可以定義不同類型的節點,以及他們之間是如何連接的。在客戶端這邊,這創建了一種類似面向對象編程的模式:引用其他類型的類型。在服務端,由於GraphQL定義了接口,你可以在任何後端自由的使用它。

GraphQL中的類型主要分爲一下幾種:

  1. 對象類型(Object Types)
    一個 GraphQL schema 中的最基本的組件是對象類型,它就表示你可以從服務上獲取到什麼類型的對象,以及這個對象有什麼字段。在graphQL.Net中,對應的類型是ObjectGraphType.

  2. 標量類型(Scalar Types)
    標量類型沒有任何次級字段,它們是查詢的葉子節點。GraphQL自帶一組默認標量類型:
    Int:有符號32位整數。
    Float:有符號雙精度浮點值。
    String:UTF-8字符序列。
    Boolean:true或者false。
    ID:ID標量類型表示一個唯一標識符,通常以重新獲取對象或者作爲緩存中的鍵。
    ID類型使用和String一樣的方式序列化;然而將其定義爲ID意味着並不需要人類可讀型。
    GraphQL的net版本中這些類型的對應關係如下:

GraphQL類型 GraphQL.Net實現類型 AspNet類型
Int IntGraphType int
Float FloatGraphType float
String StringGraphType string
Boolean BooleanGraphType bool
Id IdGraphType string

除了這些類型外,我們還可以自定義標量類型。標量類型在GraphQL.Net中的基類是ScalarGraphType。繼承ScalarGraphType並實現其抽象方法其序列化、反序列化和驗證即可。GraphQL.Net本身幫我們實現了更多標量:DecimalGraphType、DateTimeGraphType、DateGraphType、ByteGraphType、UriGraphType等很多常用的標量類型。

  1. 枚舉類型(Enumeration Types)
    枚舉類型是一種特殊的標量,它限制在一個特殊的可選值集合內。枚舉類型對應GraphQL.Net中的EnumerationGraphType,對應AspNet中的Enum類型。

  2. 表和非空類型(Lists and Not-Null)

    對象類型、標量以及枚舉是 GraphQL 中你唯一可以定義的類型種類。但是當你在 schema 的其他部分使用這些類型時,或者在你的查詢變量聲明處使用時,你可以給它們應用額外的類型修飾符來影響這些值的驗證。列表在GraphQL文檔中的規範是通過中括號[]表示。例如[Test]代表的就是返回類型爲Test的列表。在GraphQL.Net中的類型是ListGraphType,對應AspNet中的List。

    非空類型在GraphQL文檔中的規範是通過感嘆號!表示。例如Test!代表的是這個類型不能爲空。在GraphQL.Net中的類型是NonNullGraphType。如果要表示一個字段非空,還可以通過如下語句實現:

    Field(x => x.id,nullable:false).Description("Id");
  1. 接口(Interfaces)
    一個接口是一個抽象類型,它包含某些字段,而對象類型必須包含這些字段,才能算實現了這個接口。接口在GraphQL.Net中對應的類型是InterfaceGraphType。

  2. 聯合類型(Union Types)
    聯合類型和接口十分相似,但是它並不指定類型之間的任何共同字段,聯合類型在GraphQL.Net中對應的類型是UnionGraphType。

  3. 輸入類型(Input Types)
    目前爲止,我們只討論過將例如枚舉和字符串等標量值作爲參數傳遞給字段,但是你也能很容易地傳遞複雜對象。這在變更(mutation)中特別有用,因爲有時候你需要傳遞一整個對象作爲新建對象。在 GraphQL schema language 中,輸入對象看上去和常規對象一模一樣,除了關鍵字是 input 而不是 type。輸出類型在GraphQL.Net中對應的類型是InputObjectType。

類型實例:
傳統的Model:

public class Student
{
    public int id { get; set; }
    public string name { get; set; }
    public int score { get; set; }
}

GraphQL的對象類型的定義:

public class StudentOutputGraphType:ObjectGraphType<Student>
   {
       public StudentOutputGraphType()
       {
            Description = "學生信息輸出類型";
            Field(x => x.id,nullable:true).Description("Id");
            Field(x => x.name).Description("姓名");
            Field(x => x.score).Description("分數");       
        }    
}

GraphQL Input類型的定義:

public class StudentInputGraphType:InputObjectGraphType<Student>
   {
       public StudentInputGraphType()
       {
            Description = "學生信息輸入類型";
            Field(x => x.name).Description("姓名");
            Field(x => x.score).Description("分數");       
    }
}

對象類型、輸入類型、列表和非空類型就已經能完成基本的操作了。內置的標量類型一般也夠用了。返回特定最小原子對象的時候,可能會需要生成自定義的標量。這幾種GraphQL類型與AspNet的類型轉換主要是通過Net的GraphQL引擎去完成的。下一節將講述GraphQL引擎的轉換過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章