GraphQL(Graph Query Language)即圖形化查詢語言。使用GraphQL,可以將所有的業務建模爲圖。圖是將很多真實世界現象變成模型的強大工具,因爲它們和我們自然的心智模型和基本過程的口頭描述很相似。通過GraphQL,可以把我們的業務領域通過定義schema建模成一張圖;在Schema中,可以定義不同類型的節點,以及他們之間是如何連接的。在客戶端這邊,這創建了一種類似面向對象編程的模式:引用其他類型的類型。在服務端,由於GraphQL定義了接口,你可以在任何後端自由的使用它。
GraphQL中的類型主要分爲一下幾種:
-
對象類型(Object Types)
一個 GraphQL schema 中的最基本的組件是對象類型,它就表示你可以從服務上獲取到什麼類型的對象,以及這個對象有什麼字段。在graphQL.Net中,對應的類型是ObjectGraphType. -
標量類型(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等很多常用的標量類型。
-
枚舉類型(Enumeration Types)
枚舉類型是一種特殊的標量,它限制在一個特殊的可選值集合內。枚舉類型對應GraphQL.Net中的EnumerationGraphType,對應AspNet中的Enum類型。 -
表和非空類型(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");
-
接口(Interfaces)
一個接口是一個抽象類型,它包含某些字段,而對象類型必須包含這些字段,才能算實現了這個接口。接口在GraphQL.Net中對應的類型是InterfaceGraphType。 -
聯合類型(Union Types)
聯合類型和接口十分相似,但是它並不指定類型之間的任何共同字段,聯合類型在GraphQL.Net中對應的類型是UnionGraphType。 -
輸入類型(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引擎的轉換過程。