GraphQL:DataLoader的神奇

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

                                        ——出自 https://graphql.cn

Rest API中,一个api,通过参数,只能获取这个参数范围内的数据,如果想获取别的参数范围内数据,就得再次调用,比如GetStudent(id),想获取多个Student,就得多次调用,把替换id就可以,GraphQL的其中优势就是,在一次请求中,返回你所要的数据,减少请求,就像请求聚合。

using GreenDonut;
using HotChocolate;
using HotChocolate.Data;
using HotChocolate.Fetching;
using HotChocolate.Resolvers;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;namespace GraphQLDemo04
{public class Startup{/// <summary>/// Persons只是假装数据库/// </summary>public static List<Result<Student>> Persons = new List<Result<Student>>();public void ConfigureServices(IServiceCollection services){for (int i = 0; i < 200; i++){//NameCreater.GetFullName只是随机生成人的名称var student = new Student { Id = i, Tel = "13453467" + i.ToString("D3"), Name = NameCreater.GetFullName() };var result = Result<Student>.Resolve(student);Persons.Add(result);}services.AddGraphQLServer().AddQueryType<Query>();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGraphQL();});}}/// <summary>/// 查询类/// </summary>public class Query{public Task<Student> GetStudent(int id, [DataLoader] StudentDataLoader loader){return loader.LoadAsync(id);}}/// <summary>/// /// </summary>public class StudentDataLoader : DataLoaderBase<int, Student>{public StudentDataLoader(IBatchScheduler scheduler) : base(scheduler){}protected override ValueTask<IReadOnlyList<Result<Student>>> FetchAsync(IReadOnlyList<int> keys, CancellationToken cancellationToken){return new ValueTask<IReadOnlyList<Result<Student>>>(Startup.Persons.Where(s => keys.Contains(s.Value.Id)).ToList());}}/// <summary>/// 学生/// </summary>public class Student{public int Id { get; set; }public string Name { get; set; }public string Tel { get; set; }}
}

代码中的StudentDataLoader就是来完成请求聚合的。

请求条件如下,请求四个id=10,id=20,id=30,id=40

{a:student(id:10){idnametel}b:student(id:20){idnametel}c:student(id:30){idnametel}d:student(id:40){idnametel}
}

返回结果:

调置断点,可以看到监视里的keys是四个元素,一次请求来的,DataLoader会把条件id分离出来提供给我们,方便进行后端数据查询,这也是便是DataLoader的神奇之处。

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

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

相关文章

【Azure Show】|第九期 “我的计算机入门之路” 嘉宾秦婷婷汪宇杰文轩

欢迎来到Azure Show!Azure Show欢迎来到Azure Show 第九期&#xff01;继上期【搭上AI快车】为大家带来数位微软技术专家于各自IT技术领域的经验分享&#xff0c;有2400多人在线上通过b站看了这个特辑的直播&#xff0c;非常非常感恩&#xff01;本期继续和广州图书馆合作&…

调试实战 | 通过转储文件分析程序无响应之使用 windbg + IDA 逆向篇

缘起 最近&#xff0c;接连在项目中遇到了两个界面无响应的问题。都只发生在客户特定机器上&#xff0c;不方便直接调试&#xff0c;只能抓取 dump 进行事后分析了。抓取 dump 远程连上可以重现问题的机器&#xff0c;使用 process explorer 初步观察卡死的进程&#xff0c;发现…

跟我一起学Redis之高可用从主从复制开始

前言现在遇到高并发场景时&#xff0c;缓存技术应该算是性能优化的第一步&#xff0c;缓解数据库压力的同时还能提高访问效率&#xff0c;而Redis应该是绝大多数应用场景的首选。但是尽快Redis性能再优秀&#xff0c;在当今高并发场景下&#xff0c;一台服务器负责读写&#xf…

【.Net core】EFCore——Code First生成数据库与表

Code First——领域设计模式中非常有用。使用 Code First 模式&#xff0c;专注于领域设计&#xff0c;创建领域类&#xff0c;然后生成数据库。1.创建数据模型类一般就是数据库里面有哪些表&#xff0c;就创建哪些模型&#xff0c; POCO 类就够了。public partial class SmsPu…

龙芯.NET正式发布 开源共享与开发者共成长

2020年12月19日&#xff0c;2020中国. NET开发者大会于苏州盛大开幕。本次大会以“开源、共享、创新”为主题&#xff0c;以线下城市苏州为中心&#xff0c;覆盖北京、上海、深圳、广州、长沙、成都、厦门、胶东等地区&#xff0c;是中国 .NET 开发者的大聚会&#xff0c;线上线…

划入 .NET 6版本目标,微软鼓励开发人员信任第三方库

喜欢就关注我们吧&#xff01;鉴于许多 .NET 社区的开发人员都不愿意使用非微软官方打造的库&#xff0c;近日&#xff0c;微软 .NET Framework 团队的项目经理 Immo Landwerth 发布了一个名为”Growing the .NET ecosystem“的文档&#xff0c;以鼓励 .NET 开发人员加强对第三…

归并排序 java 迭代_经典排序算法之归并排序(示例代码)

归并排序(英语&#xff1a;Merge sort&#xff0c;或mergesort)&#xff0c;是创建在归并操作上的一种有效的排序算法&#xff0c;效率为(大O符号)。1945年由约翰冯诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用&#xff0c;且各层分治递归可以…

新鲜高频笔面试题分享,Redis、MongoDB、ElasticSearch...

2020年可能是最短的一年&#xff0c;上班没几个月就发现要元旦了&#xff1b;2020年可能是最难的一年&#xff0c;各种降薪被离职风波&#xff1b;然而好消息是&#xff0c;2021年马上来了&#xff0c;跳槽季也要来了&#xff0c;一起开始备战吧&#xff0c;新年薪资up up&…

在 Windows 服务中托管 ASP.NET Core

概述众所周知&#xff0c;ASP.NET Core采用了和传统ASP.NET不同的托管和HTTP处理方式&#xff0c;即把服务器和托管环境完全解耦。ASP.NET Core内置了两个HTTP服务器实现&#xff0c;一个是基于libuv实现的Kestrel&#xff08;支持跨平台&#xff09;&#xff0c;一个是基于Win…

目录 | 数据结构与剑指Offer系列推文合集

【目录合集】| 作者 / Edison ZhouC#刷数据结构剑指Offer不知不觉&#xff0c;C#刷剑指Offer的系列推文就结束了&#xff0c;今天就把它们整理成目录合集。此外&#xff0c;考虑到剑指Offer和数据结构的关联&#xff0c;建议没有数据结构基础的童鞋先看看数据结构&#xff0c;再…

Abp vNext异常处理的缺陷/改造方案

之前吐槽Abp的用户/租户管理模块&#xff01;今天我又来了&#xff0c;这次我给Abp官方repo提了一个issue。目前Website使用Abp vNext开发&#xff0c;免不了要全局处理异常、提示服务器异常信息。1. Abp官方异常处理Abp项目默认会启动内置的异常处理&#xff0c;默认不将异常信…

开源项目葫芦藤:IdentityServer4的实现及其运用

前言本篇文章主要是讲解葫芦藤项目中对IdentityServer的实践使用&#xff0c;为了使您对本篇文章中所讲述的内容有深刻的认识&#xff0c;并且在阅读时避免感到乏味&#xff0c;文中的内容不会涉及太多的基础理论知识&#xff0c;而更多的是采用动手实践的方式进行讲解&#xf…

java io 读取多个对象_Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解...

有必要多看几遍的关于字符和字节&#xff0c;例如文本文件&#xff0c;XML这些都是用字符流来读取和写入。而如RAR&#xff0c;EXE文件&#xff0c;图片等非文本&#xff0c;则用字节流来读取和写入。读写对象&#xff0c;传输对象在Java中很常使用&#xff0c;在javaBean中就经…

Beetlex之websocket/tls服务压测工具

为了方便压力测试ws服务&#xff0c;Beetlex同样提供相关工具来对ws/wss服务的性能进行测试测试。安装可以访问https://github.com/beetlex-io/TCPBenchmarks 下载最新版本工作&#xff0c;工具可以运行在linux和windows系统&#xff0c;安装完成后通过浏览器访问相关服务进行操…

大学班里80%都去培训班,为什么我没去

背景大四刚开始&#xff0c;各大培训机构就开始到各大高校开始宣传&#xff0c;我们学校也不例外&#xff1b;当时信息与计算科学这专业在我们学校并不景气&#xff0c;有好几次听说&#xff1a;如果我们那届的就职率还不行的话&#xff0c;那很大可能将此专业拿掉&#xff1b;…

如何在 C# 中使用 Buffer

缓冲区 是内存中的一组字节序列&#xff0c;缓冲 是用来处理落在内存中的数据&#xff0c;.NET 缓冲 指的是处理 非托管内存 中的数据&#xff0c;用 byte[] 来表示。当你想把数据写入到内存或者你想处理非托管内存中的数据&#xff0c;可以使用 .NET 提供的 System.Buffer类&a…

.NET SDK-Style 项目(Core、Standard、.NET5)中的版本号

.NET SDK-Style 项目&#xff08;Core、Standard、.NET5&#xff09;中的版本号独立观察员 2020 年 12 月 24 日之前 .NET Framework 时&#xff0c;项目版本号等信息是存储在 AssemblyInfo.cs 文件中&#xff0c;通过程序集特性进行设置&#xff1a;.NET Core 之后&#xff0c…

[Stardust]星尘分布式全链路监控

随着业务的发展&#xff0c;微服务系统会变得越来越大&#xff0c;各个服务之间的调用关系也会日趋复杂。一个WebApi请求&#xff0c;后方可能经历多个微服务以及数据库和MQ操作&#xff0c;在这个调用过程中&#xff0c;可能因为某一个服务节点出现延迟或者失败&#xff0c;而…

如何在 C# 中使用 const,readonly,static

平时在开发时经常会用到 const,readonly,static 关键字&#xff0c;可以肯定这些关键词是完全不同的概念&#xff0c;但有时候他们在用法上很相似以至于在场景中不知道选择哪一个&#xff0c;这篇文章我们就来讨论 C# 中的 const&#xff0c;static 和 readonly 关键词&#xf…

2020,你收获了什么?又失去了什么?

这是头哥侃码的第228篇原创今天是圣诞节&#xff0c;既魔幻又真实的2020年&#xff0c;还有6天就要结束了。每年的年末&#xff0c;我都习惯在下班途中&#xff0c;把头靠在地铁车厢两侧的扶手上&#xff0c;闭上眼睛开始思考自己过去一年的收获与得失&#xff0c;并把这些思绪…