GraphQL:Descriptor Attributes
生活随笔
收集整理的這篇文章主要介紹了
GraphQL:Descriptor Attributes
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
GraphQL 既是一種用于 API 的查詢語言也是一個滿足你數(shù)據(jù)查詢的運行時。GraphQL 對你的 API 中的數(shù)據(jù)提供了一套易于理解的完整描述,使得客戶端能夠準確地獲得它需要的數(shù)據(jù),而且沒有任何冗余,也讓 API 更容易地隨著時間推移而演進,還能用于構(gòu)建強大的開發(fā)者工具。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??——出自?https://graphql.cn
HotChocolate中可以通過定義Attribute來增加通用性處理功能,之前博文中用過UsePaging分頁,UseFiltering過濾,UseSorting排序,我們也可以自定義特性類來達到處理統(tǒng)一數(shù)據(jù)的作用,下面的例子就是一個脫敏的特性類,可以在使用特性類時告訴系統(tǒng)那些數(shù)據(jù)是不顯示出來的,此類就會把數(shù)據(jù)變成等長的*號字符串來替換。
using HotChocolate; using HotChocolate.Data; using HotChocolate.Execution; using HotChocolate.Types; using HotChocolate.Types.Descriptors; using System; using System.Collections; using System.Collections.Generic; using System.Reflection;namespace GraphQLBase004 {class Program{static void Main(string[] args){DescriptorAttributeDemo.Run();}}public class DescriptorAttributeDemo{public static void Run(){var schema = SchemaBuilder.New().AddProjections().AddQueryType<Query>().Create();var executor = schema.MakeExecutable();Console.WriteLine(executor.Execute("{?user{id?userName?password?tel}?}").ToJson());Console.WriteLine("===============");Console.WriteLine(executor.Execute("{?users{id?userName?password?tel}?}").ToJson());}/// <summary>/// 查詢類/// </summary>public class Query{[UseProjection][UseDesensitization(SensitiveFields = new string[] { "password", "tel" })]public?User?GetUser(){return new User{Id = 1,UserName = "gsw",Tel = "13453467114",Password = "111111"};}[UseProjection][UseDesensitization(SensitiveFields = new string[] { "password", "tel" })]public?List<User>?GetUsers(){return new List<User>(){new User{Id = 1,UserName = "gsw",Tel = "13453467114",Password = "111111"},new User{Id = 1,UserName = "gsw",Tel = "13453467114",Password = "111111"}};}}/// <summary>/// 用戶/// </summary>public class User{public int Id { get; set; }public string UserName { get; set; }public string Tel { get; set; }public string Password { get; set; }}/// <summary>/// 脫敏特性類/// </summary>public class UseDesensitizationAttribute : ObjectFieldDescriptorAttribute{public string[] SensitiveFields{get; set;}public override void OnConfigure(IDescriptorContext context, IObjectFieldDescriptor descriptor, MemberInfo member){descriptor.Use(next => context =>{var obj = context.GetType().GetMethod("Parent").MakeGenericMethod(context.ObjectType.RuntimeType).Invoke(context, new object[0]);var resultObj = (member as MethodInfo).Invoke(obj, new object[0]);foreach (var proName in SensitiveFields){var resulttType = resultObj.GetType();//處理泛型集合if (resulttType.IsGenericType){foreach (var resultItem in (resultObj as IList)){SetValue(proName, resultItem.GetType(), resultItem);}}else{SetValue(proName, resulttType, resultObj);}void SetValue(string proName, Type type, object resultObj){var pro = type.GetProperty(proName, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);if (pro != null && pro.PropertyType.IsAssignableFrom(typeof(string))){var len = pro.GetValue(resultObj).ToString()?.Length;pro.SetValue(resultObj, "".PadLeft(len.Value, '*'));}}}context.Result = resultObj;return next.Invoke(context);});}}} }執(zhí)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的GraphQL:Descriptor Attributes的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文说通C#中的异步迭代器
- 下一篇: 大会线上同步直播, 来不到现场也可以线上