GraphQL:面对复杂类型
GraphQL 既是一種用于 API 的查詢語(yǔ)言也是一個(gè)滿足你數(shù)據(jù)查詢的運(yùn)行時(shí)。GraphQL 對(duì)你的 API 中的數(shù)據(jù)提供了一套易于理解的完整描述,使得客戶端能夠準(zhǔn)確地獲得它需要的數(shù)據(jù),而且沒(méi)有任何冗余,也讓 API 更容易地隨著時(shí)間推移而演進(jìn),還能用于構(gòu)建強(qiáng)大的開(kāi)發(fā)者工具。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?——出自?https://graphql.cn
上一篇博文中,我們返回值是一個(gè)字符串,對(duì)于大多數(shù)情況,我們更多的是返回實(shí)體類的json格式。
第一版
using HotChocolate; using HotChocolate.Data; using HotChocolate.Execution; using HotChocolate.Types; using System; using System.Collections.Generic;namespace GraphQLBase002 {class?Program{static?void?Main(string[]?args){?????????FirstVersion.Run();???????}}//實(shí)體類public?class?Student{public?int?Id?{?get;?set;?}public?string?Name?{?get;?set;?}public?int?Age?{?get;?set;?}}#region FirstVersionpublic?class?FirstVersion{public?static?void?Run() {var schema = SchemaBuilder.New().AddQueryType<QueryType>().Create();var executor = schema.MakeExecutable();//回為返回是字符串,所以用定義的Resolver name來(lái)查詢Console.WriteLine(executor.Execute("{ students }").ToJson());}public?class?Query{public?IList<Student>?GetStudents(){return?new?List<Student>()?{new?Student?{Id = 100,Name = "ABCD",Age=20},new?Student?{Id = 101,Name = "EFGH",Age=19}};}}public?class?QueryType?:?ObjectType<Query>{protected?override?void?Configure(IObjectTypeDescriptor<Query>?descriptor) {//定義了有students來(lái)請(qǐng)求GetStudents方法,返回的類型是StringType,所以在Resolver中會(huì)把實(shí)體轉(zhuǎn)成Jsondescriptor.Field<Query>(t => t.GetStudents()).Name("students").Type<NonNullType<StringType>>().Resolver(ctx =>{var result = ctx.Parent<Query>().GetStudents();return Newtonsoft.Json.JsonConvert.SerializeObject(result);});}}}#endregion為了返回一個(gè)json,用Resolver來(lái)獲取GetStudents,并把實(shí)例親手轉(zhuǎn)成json返回,因?yàn)槭亲址?#xff0c;所以這個(gè)Field的Type是StringType。
運(yùn)行結(jié)果,看起來(lái)是個(gè)json,不,準(zhǔn)確說(shuō)是一個(gè)json格式的字符串,其實(shí)從我們定義Resolver來(lái)說(shuō)就非常清楚了;這并不是我們想要的。
第二版
這次我們?yōu)榱瞬辉偈莏son格式字符串,在代碼中定義了StudentType這個(gè)的類型,告訴系統(tǒng)Student不是一個(gè)簡(jiǎn)單類型,但Student內(nèi)的屬性,都是簡(jiǎn)單類型,所以在Configure中沒(méi)有作任何處理(如果Student中有自定義復(fù)雜類型的屬性,還得進(jìn)一步定義這個(gè)類型,并在Configure中處理),在QueryType中,處理了Query中的兩個(gè)方法的類型定義和重命名。
運(yùn)行結(jié)果如下,對(duì),這就是我們要的結(jié)果;但總覺(jué)得為了實(shí)現(xiàn)返回json,我們的代價(jià)是不是有點(diǎn)大?
第三版
#region ThreeVersionpublic class ThreeVersion{public static void Run(){var schema = SchemaBuilder.New().AddProjections().AddQueryType<Query>().Create();var?executor?=?schema.MakeExecutable();Console.WriteLine(executor.Execute("{ student{id name age} }").ToJson());Console.WriteLine(executor.Execute("{?students{id?name age}?}").ToJson());}public class Query{[UseProjection] public Student GetStudent(){return new Student{Id = 1,Name = "AAAAA",Age = 19};}[UseProjection]public List<Student> GetStudents(){return new List<Student>{new Student{Id = 100,Name = "ABCD",Age = 19},new Student{Id = 101,Name = "EFGH",Age = 20}};}}}#endregion這一版我們借雞下蛋,用UseProjection來(lái)替代了我們定義的類型,連QueryType也消失了,這樣的代碼才是我們想要的,讓我們更關(guān)注業(yè)務(wù)的邏輯,而不是關(guān)注為了GraphQL,而做很多技術(shù)配合工作;其實(shí)我們從第二版看定義的類型StudentType,QueryType,也知道這些類型是非常規(guī)律性的,是可以通過(guò)代碼手段替代的,那就是UseProjection。
運(yùn)行結(jié)果與版本二一樣。
總結(jié)
以上是生活随笔為你收集整理的GraphQL:面对复杂类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 了解一下HTTP1.1 Pipelini
- 下一篇: 为什么建议学生积极参与开源项目?