GraphQL:打造自己的Directive库

2023-11-06 03:08
文章标签 打造 graphql directive

本文主要是介绍GraphQL:打造自己的Directive库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

                                        ——出自 https://graphql.cn

HotChocolate可以通过自定义Directive来对字段的值进行转换和处理,下在的例子就是给字符串给字符串类型的值转大写和替换。

using HotChocolate;
using HotChocolate.Data;
using HotChocolate.Execution;
using HotChocolate.Types;
using System;
using System.Collections.Generic;
using System.Reflection;namespace GraphQLBase003
{class Program{static void Main(string[] args)
{DirectiveDemo.Run();}}public class DirectiveDemo{public static void Run()
{var schema = SchemaBuilder.New().AddProjections().AddQueryType<Query>().AddDirectiveType<UpperDirectiveType>().AddDirectiveType<ReplaceDirectiveType>().Create();var executor = schema.MakeExecutable();Console.WriteLine("原name=abcde ");Console.WriteLine("--------------转大写-------------------");Console.WriteLine(executor.Execute("{ student{id name @upper(name:\"this is test\")  age} }").ToJson());Console.WriteLine("--------------a替换成1 -------------------");Console.WriteLine(executor.Execute("{ student{id name @replace(old:\"a\",new:\"1\")  age} }").ToJson());Console.WriteLine("--------------然后全部转大写-.a替换成1 -------------------");Console.WriteLine(executor.Execute("{ student{id name @upper(name:\"this is test\") @replace(old:\"a\",new:\"1\")  age} }").ToJson());Console.WriteLine("--------------a替换成1.然后全部转大写-------------------");Console.WriteLine(executor.Execute("{ student{id name @replace(old:\"a\",new:\"1\")  @upper(name:\"this is test\") age} }").ToJson());}public class Query{[UseProjection]public Student GetStudent()
{return new Student{Id = 1,Name = "abcde",Age = 234};}[UseProjection]public List<Student> GetStudents(){return new List<Student>{new Student{Id = 100,Name = "aBcD",Age=10},new Student{Id = 101,Name = "EFGH",Age=20}};}}public class Student{public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }}public class UpperDirectiveType : DirectiveType<UpperDirective>{protected override void Configure(IDirectiveTypeDescriptor<UpperDirective> descriptor)
{descriptor.Name("upper");descriptor.Location(DirectiveLocation.Field);descriptor.Use(next => context =>{foreach (var directive in context.FieldSelection.Directives){if (directive.Name.Value == "upper"){if (context.Field.Member.MemberType == System.Reflection.MemberTypes.Property){var pro = context.Field.Member as PropertyInfo;var obj = context.GetType().GetMethod("Parent").MakeGenericMethod(context.ObjectType.RuntimeType).Invoke(context, new object[0]);var value = pro.GetValue(obj);pro.SetValue(obj, value.ToString().ToUpper());                            }}}return next.Invoke(context);});}}public class UpperDirective{public string Name{get;set;}}public class ReplaceDirectiveType : DirectiveType<ReplaceDirective>{protected override void Configure(IDirectiveTypeDescriptor<ReplaceDirective> descriptor)
{descriptor.Name("replace");descriptor.Location(DirectiveLocation.Field);descriptor.Use(next => context =>{foreach (var directive in context.FieldSelection.Directives){if (directive.Name.Value == "replace"){var dir = new Dictionary<string, object>();foreach (var item in directive.Arguments){dir.Add(item.Name.Value?.ToLower(), item.Value.Value);}if (context.Field.Member.MemberType == System.Reflection.MemberTypes.Property){                                var s = context.Parent<Student>();var pro = context.Field.Member as PropertyInfo;var obj = context.GetType().GetMethod("Parent").MakeGenericMethod(context.ObjectType.RuntimeType).Invoke(context, new object[0]);var value = pro.GetValue(obj);pro.SetValue(obj, value.ToString().Replace(dir["old"].ToString(), dir["new"].ToString()));                                }}}return next.Invoke(context);});}}public class ReplaceDirective{public string Old{get;set;}public string New{get;set;}}}
}

upper和replace两个Directive处理的还比较粗糙,这里主要说明Directive的定义方式;在调用这些Directive时,按照前后顺序调用,多个Directive可以同时生效,和asp.net core的中间件原理相近,上例的后两个调用 name @upper @replace和name @replace @upper返回的结果是不一样的。

这篇关于GraphQL:打造自己的Directive库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/354132

相关文章

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

VitePress 自定义主题:打造专属文档网站

VitePress 是一个基于 Vite 和 Vue 3 的静态网站生成器,特别适用于撰写文档。它不仅提供了默认的主题,还允许开发者创建和使用自定义主题,以满足特定的设计和功能需求。本文将详细介绍如何创建、使用及分发 VitePress 自定义主题,并通过实例代码进行演示。 一、创建自定义主题 1. 主题文件结构 要启用自定义主题,你需要在项目根目录下的 .vitepress 文件夹中创建一

从零开始:打造你的第一个餐厅点餐小程序

目录 1 为什么选择点餐小程序2 会有哪些功能2.1 顾客端2.2 服务员端2.3 后厨端2.4 收银端2.5 管理员(老板)端 3 开发工具选择4 你将获得什么让我们开始吧 最近,有不少粉丝咨询,有没有系统的低代码学习教程呀?为啥你的教程有的刚看的提起兴趣,怎么突然就中断了。有没有系统的视频学习教程呀,你是不是还有压箱底的好宝贝,没开放给我们看呀。 还真不是,压箱底的好宝贝已

PDF转PPT神器揭秘!3步操作,轻松打造2024年会议爆款PPT

现在是数字化的时代,PDF 和 PPT 对职场的人来说可重要了。PDF 文件格式稳,也好分享,所以大家都爱用。PPT 演示起来很厉害,在开会、讲座的时候特别管用。不过呢,要是有好多 PDF 文件,咋能快点把它们变成好看的 PPT 呢?这是很多职场人都发愁的事儿。今天呢,我给大家讲讲三款能把 PPDF转PPT的好工具,只要简单三步,就能让你轻松做出 2024 年开会用的爆款 PPT。 一、福昕高级

南卡科技“满分之选”全新开放式耳机发布,打造超越Pro的极致体验!

在音频技术的不断革新中,南卡品牌以其深厚的声学底蕴和对创新的不懈追求,再次为市场带来惊喜。今天,我们自豪地宣布,南卡OE Pro2开放式蓝牙耳机正式亮相,它不仅代表了南卡在开放式耳机领域的技术巅峰,更是对音质和佩戴舒适度的双重革新。 31°悬浮倾斜设计,无感佩戴的新高度 南卡OE Pro2将对耳机舒适性的诠释拉升到一个新境界,采用了开放式佩戴设计,彻底告别了传统耳机的堵塞感。基于上万耳

ASP.NET Core 入门教学十七 GraphQL入门指南

GraphQL 是一种用于 API 的查询语言,允许客户端请求所需的数据,并能够合并多个资源到一个请求中。在 ASP.NET Core 中使用 GraphQL 可以提供更灵活、高效和实用的数据查询方式。以下是 ASP.NET Core 中 GraphQL 的入门指南: 1. 安装必要的 NuGet 包 首先,你需要安装以下 NuGet 包: GraphQLGraphQL.Server.Tra

uni-app--》打造个性化壁纸预览应用平台(三)

🏙️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名前端工程师 🌄个人主页:亦世凡华、 🌆系列专栏:uni-app 🌇座右铭:人生亦可燃烧,亦可腐败,我愿燃烧,耗尽所有光芒。 👀引言 ⚓经过web前端的学习,相信大家对于前端开发有了一定深入的了解,今天我开设了uni-app专栏,对于想从移动端开发方向进一步发展的朋友,希望看到我文章的朋友能对你有所帮助。

graphQL 管理API的流行趋势

管理API的流行趋势为 graphQL   官网参考地址   https://graphql.org.cn/