GraphQL:面对复杂类型

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。

运行结果与版本二一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么建议学生积极参与开源项目?

喜欢就关注我们吧&#xff01;“ 你参与过开源项目吗&#xff1f;” 随着开源技术对信息产业的积极影响进一步扩大&#xff0c;越来越多的面试官将是否参与开源项目作为考核开发者能力的一项基本指标。对于求职者来说&#xff0c;参与开源能为简历增色不少 &#xff0c;增加赢得…

微服务技术栈及分享计划

前言上一篇对微服的演变、优缺点进行了概述&#xff0c;对于业务复杂项目&#xff0c;微服务算是比较合适的解决方案&#xff1b;对于咱们开发者来说&#xff0c;有好的解决方案肯定要跟进学习&#xff0c;但不能盲目追崇流行技术&#xff0c;目的还是为了解决问题。这里就把As…

PAT乙级题目——1002写出这个数

问题分析&#xff1a;1.数据比较大&#xff0c;并且输入数据时没有停顿&#xff0c;所有使用字符串来存储数据 string str""; cin>>str;2.使用字符串数组来存储每个数字的拼音 string S[10]{"ling","yi","er","san"…

Linux性能挖潜的隐藏招数:内核CPU亲和性参数调整

作者&#xff1a;李彬&#xff0c;赵雪枫&#xff0c;金融科技工程师&#xff0c;架构师社区特邀作者&#xff01;应用服务性能调优&#xff0c;是每个系统投产前都需要关注的问题&#xff0c;系统及软件层面的调优方法均有大量文章介绍&#xff0c;但在所有招数使出后&#xf…

PAT乙级——1001害死人不偿命的(3n+1)猜想(太简单)

#include<iostream> using namespace std;int main(){int n;int ans0;//记录走过的步数 cin>>n;while(n!1){if(n%20){ans;nn/2;}else{ans;n(3*n1)/2;}}cout<<ans;return 0; }

好的重构方法才能摆脱“屎山”

大家好&#xff0c;我是Z哥。最近在整理一些项目&#xff0c;所以相关的文章写的多了些。之前的相关文章有《聊聊单元测试》&#xff0c;感兴趣的话可以点击文末链接去阅读。这次整理项目的时候&#xff0c;做了比较多的codereview和重构。好久没做这么高强度了重构了&#xff…

在 Asp.Net Core 中使用 worker services

ASP.Net Core 3.0 Preview 3 新增了一个 worker services&#xff0c;那什么是 worker services 呢&#xff1f;它如同 windows服务 或者 Linux守护进程 一样的后台服务&#xff0c;在 Visual Studio 中提供了一个专门创建 worker services 的模板&#xff0c;如下图&#xff…

react全局状态管理_rxv: 在React中用Vue3的reactivity包实现状态管理。

前言React的状态管理是一个缤纷繁杂的大世界&#xff0c;光我知道的就不下数十种&#xff0c;其中有最出名immutable阵营的redux&#xff0c;有mutable阵营的mobx&#xff0c;react-easy-state&#xff0c;在hooks诞生后还有极简主义的unstated-next&#xff0c;有蚂蚁金服的大…

VS Code 变身约会利器!以码会友,轻松找到心仪的TA!

在韩老师的《Visual Studio Code 权威指南》一书中&#xff0c;我向大家推荐了许多好用的插件&#xff0c;其中也不乏许多摸鱼插件&#xff0c;刷知乎、炒股票、看电影、听音乐、追番、看小说&#xff0c;一应俱全。前不久&#xff0c;韩老师还给大家推荐过一款“小霸王”插件&…

机器学习——常用算法的总结

机器学习常用算法总结 机器学习——常用算法的总结学习方式一、监督式学习&#xff1a;1、分类2、回归补充——线性回归与逻辑回归二、非监督式学习&#xff1a;三、半监督式学习&#xff1a;四、强化学习&#xff1a;算法类似性一、回归算法&#xff1a;二、基于实例的算法三、…

机器学习——决策树学习

机器学习——决策树学习一、什么是决策树二、决策树的学习过程特征选择&#xff1a;决策树生成&#xff1a;剪枝&#xff1a;三、决策树的一个具体的实例导入数据python strip() 函数和 split() 函数的详解及实例数据处理提取到训练集中的标签给数据的每一列添加上标签&#xf…

微软:Excel公式是世界上使用最广泛的编程语言

喜欢就关注我们吧&#xff01;文|一君微软近日推出了一项 Excel 公式构建的新功能 LAMBDA&#xff0c;正则测试阶段。LAMBDA 允许使用 Excel 自身的公式语言自定义功能&#xff0c;而过去&#xff0c;Excel 中需要通过 JS 等语言编写自定义函数。同时&#xff0c;LAMBDA 还可以…

机器学习——文件的读取

机器学习——文件的读取(一).txt文件的读取(二)excel文件读取操作(一).txt文件的读取 txt的链接 链接&#xff1a;https://pan.baidu.com/s/1fIAUdCDTpR7TiqLHZtx1yg 提取码&#xff1a;0929 python strip() 函数和 split() 函数的详解及实例 一直以来都分不清楚strip和split…

linux select读取节点数据失败_MySQL中覆盖索引查询和select*查询执行结果案例分析...

索引优化建议在MySQL中要尽可能使用覆盖索引进行检索&#xff0c;只访问索引的查询(索引列和查询列一致)&#xff0c;减少select * 可提高查询效率覆盖索引(Covering Index)理解方式一:就是select的数据列只用从索引中就能够取得&#xff0c;不必读取数据行&#xff0c;MySQL可…

使用 Azure WAF 羞辱黑客的智商

点击上方蓝字关注“汪宇杰博客”导语还记得之前给大家介绍过的《使用 Azure Web 应用防火墙拦截黑客攻击》吗&#xff1f;今天我又带来了一个有趣的 Azure WAF 小技巧&#xff0c;可以让你爽一把。好奇的黑客今天 Azure Application Insights 上发现了一段集中时间的404错误&am…

机器学习之乳腺癌问题(SVM)

机器学习之乳腺癌问题SVM题目所需的代码及数据利用SVM建模SVM调参题目所需的代码及数据 链接&#xff1a;https://pan.baidu.com/s/1bS7Ku_PUfcimiVkmLz9Fzw 提取码&#xff1a;0929 利用SVM建模 import matplotlib.pyplot as plt import pandas as pd import numpy as npfro…

如何将日志记录到 Windows事件日志 中

每当出现一些未捕获异常时&#xff0c;操作系统都会将异常信息写入到 Windows 事件日志 中&#xff0c;可以通过 Windows 事件查看器 查看&#xff0c;如下图&#xff1a;这篇文章将会讨论如何使用编程的方式将日志记录到 Windows 事件日志 中。安装 EventLog 要想在 .NET Core…

【Java】springboot

文章目录 Spingboot1、起步依赖2、构建springboot工程jar包3、springboot配置文件4、多环境配置5、maven和boot多环境兼容问题6、配置文件分类7、springboot整合mybatis Spingboot springboot用来简化spring的初始搭建以及开发过程。 比方说&#xff0c;创建一个springmvc程序…

数据科学与python语言——Matplotlib数据可视化基础

Matplotlib数据可视化基础一.读取数据与数据处理阶段1.提取指定行中的数据2.得到>指定数值的数据3.得到指定值得数据4.整体的数据处理&#xff1a;二.画图函数1.plt.subplots()2.plt.subplots_adjust()3.设置x轴y轴的刻度和标签4.使用中文标题在作图时三.画折线图(plot)四.画…

2021年,Azure云遇到. NET5,注定开启高光时刻,微软的心,真大!

云开发诞生的市场背景云开发是一个已经存在了很多年的概念&#xff0c;但在过去未能真正成为主流。然而&#xff0c;由于云和软件即服务的宏观趋势的结合&#xff0c;以及技术的进步&#xff0c;如容器技术 Docker 和 Kubernetes&#xff0c;云开发现在有机会最终成为基于云的应…