GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。

——出自 https://graphql.cn

上一篇博文中,我们返回值是一个字符串,对于大多数情况,我们更多的是返回实体类的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();       }}//实体类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来查询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来请求GetStudents方法,返回的类型是StringType,所以在Resolver中会把实体转成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

为了返回一个json,用Resolver来获取GetStudents,并把实例亲手转成json返回,因为是字符串,所以这个Field的Type是StringType。

运行结果,看起来是个json,不,准确说是一个json格式的字符串,其实从我们定义Resolver来说就非常清楚了;这并不是我们想要的。

第二版

    #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

这次我们为了不再是json格式字符串,在代码中定义了StudentType这个的类型,告诉系统Student不是一个简单类型,但Student内的属性,都是简单类型,所以在Configure中没有作任何处理(如果Student中有自定义复杂类型的属性,还得进一步定义这个类型,并在Configure中处理),在QueryType中,处理了Query中的两个方法的类型定义和重命名。

运行结果如下,对,这就是我们要的结果;但总觉得为了实现返回json,我们的代价是不是有点大?

第三版

#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来替代了我们定义的类型,连QueryType也消失了,这样的代码才是我们想要的,让我们更关注业务的逻辑,而不是关注为了GraphQL,而做很多技术配合工作;其实我们从第二版看定义的类型StudentType,QueryType,也知道这些类型是非常规律性的,是可以通过代码手段替代的,那就是UseProjection。

运行结果与版本二一样。

GraphQL:面对复杂类型相关推荐

  1. GraphQL入门之Schema和类型规范

    GraphQL的Schema 和类型规范 Schema 是用于定义数据结构的,比如说,User对象中有哪些属性,对象与对象之间是什么关系等. 参考官网文档:http://graphql.cn/lear ...

  2. GraphQL —— 标量类型

    标量(ScalarTypeDefinition)是 GraphQL 中不可分割的原子数据类型,在服务中充当叶子节点.对于客户端而言,合法的查询集(Select Set)必须到达叶子节点,也就是到达标量 ...

  3. 干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案

    作者简介 古映杰,携程研发高级经理,负责前端框架和基础设施的设计.研发与维护.开源项目react-lite和react-imvc作者. 前言 随着多终端.多平台.多业务形态.多技术选型等各方面的发展, ...

  4. 还在用 Redux,要不要试试 GraphQL 和 Apollo?

    还在用 Redux,要不要试试 GraphQL & Apollo? 前段时间刷 Twitter 的时候看到大 V 纷纷提到 Apollo,预测它将在 2018 年崛起.正巧碰上有使用 Grap ...

  5. 杭州 GraphQLParty 第一场-GraphQL 数据聚合层解放前后端文字版

    Scott:各位大牛,大神,大咖大家下午好,我是 Scott,也是这次杭州第一届 GraphQLParty 的发起人. 先回到会议的主题,为什么会开这么一个会议?原本这个会议报名的时候希望可以控制到 ...

  6. java通用象棋游戏_在通用国际象棋界面周围模拟GraphQL包装器

    java通用象棋游戏 The Universal Chess Interface (UCI) has been around a long time and used by many chess en ...

  7. GraphQL 渐进学习 07-graphql-node-server-模块化

    GraphQL 渐进学习 07-graphql-node-server-模块化 目标 为了便于维护,模块化 node 服务端 代码 代码抽取层次分为 schema 定义 类型 业务对象 查询 更改 r ...

  8. [C#基础知识系列]专题十七:深入理解动态类型

    本专题概要: 动态类型介绍 为什么需要动态类型 动态类型的使用 动态类型背后的故事 动态类型的约束 实现动态行为 总结 引言: 终于迎来了我们C# 4中特性了,C# 4主要有两方面的改善--Com 互 ...

  9. GraphQL(二):GraphQL服务搭建

    在GraphQL(一):GraphQL介绍中讲到目前已经有很多平台完成了GraphQL实现,这里以Java平台为例,介绍GraphQL服务的搭建. graphql-java + graphql-jav ...

最新文章

  1. 机器学习中过拟合、欠拟合与方差、偏差的关系是什么?
  2. MySQL中有关TIMESTAMP和DATETIME的总结
  3. mysql 枚举_是否推荐使用MySQL的enum类型?
  4. ERP项目实施记录05
  5. eclipse内存设置,tomcat内存设置,查看内存大小
  6. pacs系统服务器配置需求,pacs系统服务器配置
  7. docker部署finebi 帆软
  8. Redis【10】-Redis发布订阅
  9. 热闹之后,香港是否会成为Web3的“应许之地”?
  10. 什么错误是计算机检查不出来的,电脑开机检测不到硬盘,提示3F0,求助大神如何检测硬盘的问题. 求大佬指点...
  11. python爬虫专家_Python爬虫入门教程:微医挂号网专家团队数据抓取pyspider
  12. C语言(百钱买百鸡问题)
  13. 哈工大2021 形式语言与自动机期末
  14. Vant在微信小程序中的使用
  15. 教你如何制作vue+springboot项目
  16. 解决 ERROR: cannot launch node of type [xxx]: can‘t locate node [xxx] in package [xxx]
  17. QTreeWidget 勾选三种状态
  18. 免费实用的电子相册制作软件吧?这有3款口碑好的音乐相册制作app
  19. 京东要自己干保险!刘强东砸下4.83亿,曾不满“保险公司挂羊头卖狗肉”...
  20. 国家地理信息数据获取

热门文章

  1. ASP.NET WebApi 基于JWT实现Token签名认证
  2. php用两个栈来实现队列
  3. BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA
  4. JavaScript中数组slice和splice的对比小结
  5. 关于电商购物车与订单
  6. CAP理论与MongoDB一致性、可用性的一些思考
  7. Httpclient发送json请求
  8. 初识Spark2.0之Spark SQL
  9. kdbchk: the amount of space used is not equal to block size
  10. linux top 命令---VIRT,RES,SHR,虚拟内存和物理内存(