日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

GraphQL:面对复杂类型

發(fā)布時(shí)間:2023/12/4 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GraphQL:面对复杂类型 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ō)就非常清楚了;這并不是我們想要的。

第二版

#region SecondVersionpublic class SecondVersion{public?static?void?Run() {var schema = SchemaBuilder.New().AddQueryType<QueryType>().Create();var?executor?=?schema.MakeExecutable();Console.WriteLine(executor.Execute("{ student {id name} }").ToJson());Console.WriteLine(executor.Execute("{ students {id name} }").ToJson());}public?class?Query{public?Student?GetStudent() {return?new?Student{Id = 1,Name = "AAAAA",Age = 19};}public?List<Student>?GetStudents(){return?new?List<Student>{new?Student{Id = 100,Name = "ABCD",Age = 19},new?Student{Id = 101,Name = "EFGH",Age = 20}};}}public?class?StudentType?:?ObjectType<Student>{protected?override?void?Configure(IObjectTypeDescriptor<Student>?descriptor) {}}public?class?QueryType?:?ObjectType<Query>{protected?override?void?Configure(IObjectTypeDescriptor<Query>?descriptor) {descriptor.Field(t => t.GetStudent()).Type<NonNullType<StudentType>>().Name("student");descriptor.Field(t => t.GetStudents()).Type<ListType<NonNullType<StudentType>>>().Name("students");}}}#endregion

這次我們?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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。