GraphQL实战篇(一)
程序员文章站
2022-03-20 08:30:43
看过基础篇的都知道,GraphQL创建Schema有两种方式,Schema First和Graph Type,前者使用GraphQL Schema Language类似于EF的DB First;后者和EF 的Code First相似。使用GraphQL请求流程大致如下图所示,今天我就用Graph T ......
看过基础篇的都知道,graphql创建schema有两种方式,schema first和graph type,前者使用graphql schema language类似于ef的db first;后者和ef 的code first相似。使用graphql请求流程大致如下图所示,今天我就用graph type通过控制台程序简单的介绍下大致使用过程:
1、安装graphql包
graphql包提供了graphql.types命名空间,graphql的使用离不开graphql.types。
2、自定义数据模型
1 /// <summary> 2 /// 自定义客户类 3 /// </summary> 4 [table("t_customer")] 5 public partial class customerentity 6 { 7 public customerentity() 8 { 9 10 } 11 /// <summary> 12 /// 主键guid 13 /// </summary> 14 public string guid { get; set; } 15 /// <summary> 16 /// 中文性 17 /// </summary> 18 [required, column("code_cn", typename = constants.nvarchar255)] 19 public string code_cn { get; set; } 20 /// <summary> 21 /// 中文名 22 /// </summary> 23 [required, column("name_cn", typename = constants.nvarchar255)] 24 public string name_cn { get; set; } 25 /// <summary> 26 /// 英文性 27 /// </summary> 28 [required, column("code_en", typename = constants.nvarchar255)] 29 public string code_en { get; set; } 30 /// <summary> 31 /// 英文名 32 /// </summary> 33 [required, column("name_en", typename = constants.nvarchar255)] 34 public string name_en { get; set; } 35 //中文姓,中文名,英文姓,英文名,性别,生日,默认出票方式,国籍,电子邮箱,工作单位,备注 36 37 /// <summary> 38 /// 性别 39 /// </summary> 40 [required, column("sex", typename = constants.nvarchar255)] 41 public string sex { get; set; } 42 /// <summary> 43 /// 生日 44 /// </summary> 45 [required, column("birthday", typename = constants.nvarchar255)] 46 public string birthday { get; set; } 47 /// <summary> 48 /// 出票方式 49 /// </summary> 50 [required, column("drawerway", typename = constants.nvarchar255)] 51 public string drawerway { get; set; } 52 /// <summary> 53 /// 国籍 54 /// </summary> 55 [required, column("country", typename = constants.nvarchar255)] 56 public string country { get; set; } 57 /// <summary> 58 /// 电子邮箱 59 /// </summary> 60 [required, column("email", typename = constants.nvarchar255)] 61 public string email { get; set; } 62 /// <summary> 63 /// 工作单位 64 /// </summary> 65 [required, column("workunit", typename = constants.nvarchar255)] 66 public string workunit { get; set; } 67 /// <summary> 68 /// 备注 69 /// </summary> 70 [required, column("remark", typename = constants.text)] 71 public string remark { get; set; } 72 }
3、graphql的数据模型
定义graphql的数据模型该模型继承自objectgraphtype,对自定义数据模型customerentity的属性进行相应映射。
1 /// <summary> 2 /// graphql的数据模型:继承自objectgraphtype,并传递范型customerentity 3 /// </summary> 4 public class customerentitytype : objectgraphtype<customerentity> 5 { 6 //在构造函数中,对属性作影射 7 public customerentitytype() 8 { 9 name = "customers"; 10 field(x => x.guid); 11 field(x=>x.birthday); 12 field(x => x.code_cn); 13 field(x => x.code_en); 14 field(x => x.country); 15 field(x => x.drawerway); 16 field(x => x.email); 17 field(x => x.name_cn); 18 field(x => x.name_en); 19 field(x => x.remark); 20 field(x => x.sex); 21 field(x => x.workunit); 22 field<listgraphtype<customerentitytype>>("customers"); 23 } 24 25 }
4、定义操作模型
在这里我在啰嗦一遍graphql的操作包括 query(select), mutation (create,update,delete),subscription (订阅),在这里我把所有请求查询的字段映射到了customerrepository的调用上。
1 public class customerrepository : icustomerrepository 2 { 3 //public list<customerentity> customerslist { get; set; } 4 public ienumerable<customerentity> getall() 5 { 6 var jack = new customerentity 7 { 8 guid = guid.newguid().tostring(), 9 code_cn = "张", 10 name_cn = "三", 11 code_en = "jack", 12 name_en = "jack-jie", 13 sex = "男" 14 }; 15 var lx = new customerentity 16 { 17 guid = guid.newguid().tostring(), 18 code_cn = "李", 19 name_cn = "五", 20 code_en = "lx", 21 name_en = "lx-jie", 22 sex = "男" 23 }; 24 var wz = new customerentity 25 { 26 guid = guid.newguid().tostring(), 27 code_cn = "王", 28 name_cn = "三", 29 code_en = "wz", 30 name_en = "wz-jie", 31 sex = "女" 32 }; 33 34 var query = new list<customerentity> { jack, lx, wz }; 35 return query; 36 } 37 public customerentity getbyid(string guid) 38 { 39 return getall().firstordefault(x=>x.guid == guid); 40 } 41 }
查询操作:
1 /// <summary> 2 /// graphql查询 3 /// </summary> 4 public class queryaction : objectgraphtype 5 { 6 ienumerable<customerentity> customers = null; 7 icustomerrepository repository = new customerrepository(); 8 9 public queryaction() 10 { 11 field<listgraphtype<customerentitytype>>(//在构造函数中定义查询操作 12 name: "customers", //注意这个名字,后边查询的时候需要对应 13 arguments: new queryarguments //定义查询参数 14 { 15 new queryargument<stringgraphtype> 16 { 17 name = "guid", 18 description = "the guid for the customerentity" 19 }, 20 new queryargument<stringgraphtype> 21 { 22 name = "birthday", 23 description = "the birthday for the customerentity" 24 }, 25 new queryargument<stringgraphtype> 26 { 27 name = "code_cn", 28 description = "the code_cn for the customerentity" 29 }, 30 new queryargument<stringgraphtype> 31 { 32 name = "code_en", 33 description = "the code_en for customerentity" 34 }, 35 new queryargument<stringgraphtype> 36 { 37 name = "country", 38 description = "the country for customerentity" 39 }, 40 new queryargument<stringgraphtype> 41 { 42 name = "drawerway", 43 description = "the drawerway for customerentity" 44 }, 45 new queryargument<stringgraphtype> 46 { 47 name = "email", 48 description = "the email for customerentity" 49 }, 50 new queryargument<stringgraphtype> 51 { 52 name = "name_cn", 53 description = "the name_cn for customerentity" 54 }, 55 new queryargument<stringgraphtype> 56 { 57 name = "name_en", 58 description = "the name_en for customerentity" 59 }, 60 new queryargument<stringgraphtype> 61 { 62 name = "remark", 63 description = "the remark for customerentity" 64 }, 65 new queryargument<stringgraphtype> 66 { 67 name = "sex", 68 description = "the sex for customerentity" 69 }, 70 new queryargument<stringgraphtype> 71 { 72 name = "workunit", 73 description = "the workunit for customerentity" 74 } 75 }, 76 resolve: context =>// 定义查询操作的执行 77 { 78 var customercontext = context.usercontext;// 获取上下文,可在此作用户验证操作 79 customers = repository.getall(); 80 var guid = context.getargument<string>("guid"); 81 customers = customers.where(u => guid == null || u.birthday == guid); 82 var birthday = context.getargument<string>("birthday"); 83 customers = customers.where(u => birthday == null || u.birthday == birthday); 84 var code_cn = context.getargument<string>("code_cn"); 85 customers = customers.where(u => code_cn == null || u.code_cn == code_cn); 86 var code_en = context.getargument<string>("code_en"); 87 customers = customers.where(u => code_en == null || u.code_en == code_en); 88 var country = context.getargument<string>("country"); 89 customers = customers.where(u => country == null || u.country == country); 90 var drawerway = context.getargument<string>("drawerway"); 91 customers = customers.where(u => drawerway == null || u.drawerway == drawerway); 92 var email = context.getargument<string>("email"); 93 customers = customers.where(u => email == null || u.email == email); 94 var name_cn = context.getargument<string>("name_cn"); 95 customers = customers.where(u => name_cn == null || u.name_cn == name_cn); 96 var name_en = context.getargument<string>("name_en"); 97 customers = customers.where(u => name_en == null || u.name_en == name_en); 98 var remark = context.getargument<string>("remark"); 99 customers = customers.where(u => remark == null || u.remark == remark); 100 var sex = context.getargument<string>("sex"); 101 customers = customers.where(u => sex == null || u.sex == sex); 102 var workunit = context.getargument<string>("workunit"); 103 customers = customers.where(u => workunit == null || u.workunit == workunit); 104 105 return customers; 106 }); 107 108 field<customerentitytype>( 109 name: "addcustomer", //注意这个名字,后边查询的时候需要对应 110 arguments: new queryarguments //定义查询参数 111 { 112 new queryargument<stringgraphtype> 113 { 114 name = "guid", 115 description = "the guid for the customerentity" 116 }, 117 new queryargument<stringgraphtype> 118 { 119 name = "birthday", 120 description = "the birthday for the customerentity" 121 }, 122 new queryargument<stringgraphtype> 123 { 124 name = "code_cn", 125 description = "the code_cn for the customerentity" 126 }, 127 new queryargument<stringgraphtype> 128 { 129 name = "code_en", 130 description = "the code_en for customerentity" 131 }, 132 new queryargument<stringgraphtype> 133 { 134 name = "country", 135 description = "the country for customerentity" 136 }, 137 new queryargument<stringgraphtype> 138 { 139 name = "drawerway", 140 description = "the drawerway for customerentity" 141 }, 142 new queryargument<stringgraphtype> 143 { 144 name = "email", 145 description = "the email for customerentity" 146 }, 147 new queryargument<stringgraphtype> 148 { 149 name = "name_cn", 150 description = "the name_cn for customerentity" 151 }, 152 new queryargument<stringgraphtype> 153 { 154 name = "name_en", 155 description = "the name_en for customerentity" 156 }, 157 new queryargument<stringgraphtype> 158 { 159 name = "remark", 160 description = "the remark for customerentity" 161 }, 162 new queryargument<stringgraphtype> 163 { 164 name = "sex", 165 description = "the sex for customerentity" 166 }, 167 new queryargument<stringgraphtype> 168 { 169 name = "workunit", 170 description = "the workunit for customerentity" 171 } 172 }, 173 resolve: context =>// 定义查询操作的执行 174 { 175 string guid = context.getargument<string>("guid"); 176 return repository.getbyid(guid); 177 }); 178 } 179 }
更新操作:
1 /// <summary> 2 /// graphql修改更新 3 /// </summary> 4 public class mutationaction : objectgraphtype 5 { 6 private icustomerrepository _repository = new customerrepository(); 7 ienumerable<customerentity> customers = null; 8 9 public mutationaction() 10 { 11 field<stringgraphtype>( 12 "run", 13 arguments: new queryarguments(new queryargument<customerentitytype> { name = "customer" }), 14 resolve: ctx => ctx.getargument<customerentity>("customer").guid); 15 } 16 }
5、定义graphschema模型
graphschema是graphql重中之重,它是所有操作的枢纽。
1 public class graphschema : schema 2 { 3 public graphschema() 4 { 5 query = new queryaction(); 6 mutation = new mutationaction(); 7 } 8 }
6、测试调用
测试一下查询操作,关键代码如下:
1 public async void querycustomers(string code_cn, string code_en) 2 { 3 var querystr = @"{customers(code_cn:" + code_cn + ",code_en:" + "\"" + code_en + "\"" + "){code_cn code_en name_cn name_en}}"; 4 var result = await execute.executeaction(new graphqlquery { query = querystr, customerentitycontext = "add customer" }); 5 var data = result.data; 6 assert.isnull(result.errors?.count); 7 }
这里你可以修改你的查询参数,无须修改api接口便可以达到目的。
修改更新接口的操作主要代码如下:
1 public async void createcustomer(string code_cn, string code_en) 2 { 3 var querystr = @"{query: mutation ($customer: userinput!){addcustomer($customer:$customer){code_cn code_en name_cn name_en}},variables:{customer:{code_cn: " + code_cn + @",code_en:" + code_en + @"}}}"; 4 5 var query = new graphqlquery 6 { 7 query = "mutation ($customer: userinput!){addcustomer(customer:$customer){code_cn code_en name_cn name_en}}", 8 variables = jobject.parse("{customer:{\"code_cn\": \"" + code_cn + "\",\"code_en\":" + code_en + "}}") 9 }; 10 var result = await execute.executeaction(query); 11 assert.isnull(result.errors.count); 12 }
好了,以上就是我得初步总结和实践,后续会继续跟踪,欢迎纠错!!!
上一篇: 腌菜要腌多久才能吃?腌菜为什么用粗盐?