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返回的结果是不一样的。

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

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

相关文章

云付认证已通过可以支付吗_海科融通丨刷新支付日常问题【附交易操作步奏】...

01常见问题汇总QPIN秘钥检验出错A&#xff1a;认证时不要频繁点击&#xff0c;点完后等一等系统反应&#xff0c;可联系客服处理。Q报错99&#xff0c;该小商户已入网A&#xff1a;提供商户编号给服务经理处理。Q终端屏幕无法签字A&#xff1a;待机界面&#xff0c;输入#0#&…

机器学习案例——生态系统蒸散速率预测

生态系统蒸散速率预测 问题背景概述数据集、代码、报告下载实验步骤分析一、数据预处理1、 对生态观测数据表和植被数据表进行数据预处理2、将不同站点的多个表进行纵向合并3、进行质量控制及去除异常值二、筛选特征1、画相关性热力图(使用热力图进行相关性分析)2、进行特征选择…

邀请函|WorkShop报名通道开启,来就送礼!

作为互联网行业的年度盛会今年除延续以往的开幕与论坛技术分享外还增设了Work Shop 体验课程&#xff01;参加此次工作坊不仅能近距离和大佬进行互动体验项目开发的快感还能领取大会纪念卫衣、书籍等惊喜好礼是不是很期待&#xff1f;&#xff08;数量有限先到场先得&#xff0…

对象数组参数_【JavaScript 教程】标准库—Array 对象

作者 | 阮一峰1、构造函数Array是 JavaScript 的原生对象&#xff0c;同时也是一个构造函数&#xff0c;可以用它生成新的数组。var arr new Array(2);arr.length // 2arr // [ empty x 2 ]上面代码中&#xff0c;Array构造函数的参数2&#xff0c;表示生成一个两个成员的数组…

机器学习之无监督学习——聚类

机器学习之无监督学习——聚类无监督学习一、基于划分的聚类方法1、基于划分的方法 简介A、概念B、分组C、分组与样本 对应关系D、硬聚类 与 软聚类二、基于层次的聚类方法1、基于层次的聚类方法 概念 :2、基于层次的聚类方法 :A、聚合层次聚类 ( 叶子节点到根节点 )聚合层次聚…

2020 . NET大会日程公布!行程亮点全曝光

|倒计时5天文末有福利答应我看到最后|2020年12月19日由.NET众多社区联合组织主办的2020年中国.NET开发者大会将于苏州盛大开幕时间&#xff1a;2020/12/19-12/20主题&#xff1a;开源、共享、创新地点&#xff1a;苏州人工智能产业园▽本次大会以“开源、共享、创新”为主题&am…

橡皮擦_日本推出改邪归正橡皮擦,看得我头顶一凉

▲▲▲点击查看▲▲▲日本&#xff0c;可以说是文具控的天堂。各种不按套路出牌&#xff0c;又十分合理有趣的文具&#xff0c;真是太多太多。就比如这块「改邪归正橡皮擦」&#xff1a;这么看&#xff0c;你可能看不出到底怎么个改邪归正法&#xff0c;但其实它的创作灵感来自…

机器学习之琐碎知识(代码运行问题)

机器学习之琐碎知识1、python代码中忽略警告2、python在画图时显示中文1、python代码中忽略警告 解决方案&#xff1a; import warnings warnings.filterwarnings("ignore")2、python在画图时显示中文 解决方案&#xff1a; # 支持中文 plt.rcParams[font.sans-s…

三菱四节传送带控制梯形图_一文讲透FX5U PLC程序控制指令及步进梯形图编程

三菱PLC在80年代进入中国市场&#xff0c;已有30多年历史。由于三菱PLC编程易学&#xff0c;功能强大&#xff0c;深受中国用户喜爱。随着时间推移&#xff0c;市场上已经淘汰掉二代产品&#xff0c;关系图如下&#xff1a;说明90年代老型号2000年代老型号低端小型机FX0SFX1S中…

在 ASP.NET Core 中使用多种方式给 Action 传参

ASP.NET Core 是一个跨平台&#xff0c;开源的&#xff0c;轻量级&#xff0c;高性能 并且 高度模块化的web框架。在 ASP.NET Core MVC 中有很多种方式可以给 Action 方法传递参数&#xff0c;比如说&#xff1a;url方式&#xff0c;querystring方式&#xff0c;request header…

机器学习之tensorflow出现的一些问题

机器学习之tensorflow出现的一些问题 1、查看tensorflow版本2、Jupyter Notebook 工作环境配置3、anaconda查看已有环境4、anaconda进入已有的虚拟环境5、查看该环境下的TensorFlow的版本6、查看查看anaconda虚拟环境中的python 版本1、查看tensorflow版本 import tensorflow …

gitlab创建分支上传文件_Gitlab管理和使用基本教程

一、注册并设置Gitlab个人信息(一)注册Gitlab登录Gitlab站点&#xff0c;注册账户&#xff0c;设置基本个人信息。按提示操作即可。(二)配置ssh连接信息1.创建SSH密钥通过下面的命令生成密钥&#xff0c;请将命令中的YOUR_EMAILYOUREMAIL.COM替换为你注册Gitlab时用的Email地址…

WinUI 3 Preview 3 发布了,再一次试试它的性能

1. WinUI 3在微软 Build 2020 开发者大会上&#xff0c;WinUI 团队宣布可公开预览的 WinUI 3 Preview 1&#xff0c;它让开发人员可以在 Win32 中使用 WinUI。最终 XAML 的新功能不再和 Windows SDK 绑定&#xff0c;所有新的 XAML 功能都将作为 WinUI 的一部分发布。作为 OS 的…

机器学习的一般流程

机器学习的一般流程 一、数据采集与标注二、数据探索1、认识数据2、基本统计数据描述三、数据预处理1、数据清洗(1)、缺失值处理(2)、异常值处理(3)、重复值的处理2、数据集成3、数据变换(1)、简单函数变换(2)、规范化(归一化、标准化)(3)、连续属性离散化(4)、属性构造(5)、特…

m苹果放n篮子_egg appple千万别翻译为“鸡蛋苹果”,老外听到会懵圈的

egg很熟悉&#xff0c;apple也很熟悉&#xff0c;可是egg apple就让人一脸懵了&#xff0c;鸡蛋苹果是啥玩意&#xff1f;难道中国人有番茄鸡蛋&#xff0c;而歪果仁喜欢鸡蛋炒苹果&#xff1f;1&#xff1a;egg apple 是什么意思&#xff1f;其实英国人眼中的茄子是 egg apple…

基于.NET Core的简单,跨平台,模块化的电子商务系统-SimplCommerce

SimplCommerce是基于.NET Core的简单&#xff0c;跨平台&#xff0c;模块化的电子商务系统官网&#xff1a;www.simplcommerce.com开源地址&#xff1a;https://github.com/simplcommerce/SimplCommerce高层架构在线演示&#xff08;Azure网站&#xff09;店面&#xff1a;http…

acwing——每日一题——总结

acwing——每日一题——总结 第一周1、笨拙的手指(考查点:进制转换)2、干草堆(考查点:差分+前缀和)3、奶牛选美(bfs模板+floodfill算法)4、拖拉机(bfs+双端队列=迪杰斯特拉算法)5、岛6、马蹄铁7、打乱字母第二周1、寻找序列2、序列凑零3、矩阵复原第一周 1、笨拙的手指(考查…

grade项目导入新external libraries_【易推荐】德意志银行学院中国项目启动

展翅高飞 开阔眼界探索新的机遇总会令人振奋不已。德意志银行集团(以下简称德意志银行或德银)举办了“德意志银行学院”项目(DB Academy&#xff0c;以下简称“德银学院”)。如果同学们有投身金融服务行业的志向&#xff0c;欢迎加入德银学院在中国的项目。“德银学院”项目为…

程序员过关斩将--请不要误会redis 6.0 的多线程

“你对redis的单线程是不是有点误会&#xff1f;“你对redis 6.0的多线程是不是也有点误会&#xff1f;“redis多线程一定可以提高性能吗&#xff1f;redis官方刚刚发布的6.0版本已经掀起了业界一阵热波&#xff0c;在这个版本中新加了很多新特性&#xff0c;如果你打开redis的…

python 防止转义_python字符串前加r、f、u、l 的区别

f-strings 是指以f或F 开头的字符串&#xff0c;其中以 {}包含的表达式会进行值替换。&#xff08;目前支持python3.6版本&#xff09;下面看下f-strings的使用方法基本使用&#xff08;作用&#xff1a;替换值&#xff09;在字符串前加r可防止字符串转义作用&#xff1a;没有转…