一步一步在AspNetCore中使用GraphQL(一)----GraphQL在AspNetCore中的用法

一、GraphQL简介

GraphQL不单单是一种查询语言,它为现代应用程序到云服务这一问题提供了一套全面的解决方案。它构成了现代应用程序开发堆栈中一个新的重要层的基础:数据图。这个新的层将公司的所有应用程序数据和服务集中在同一个地方,具有一致、安全且易于使用的界面,因此任何人都能够通过最小的磨合使用它。--------------摘抄至GraphQL开发原则。

二、了解AspNetCore中GraphQL的使用

  1. 创建一个AspNetCore 控制台程序。
  2. 添加GraphQL Nuget包。
    在这里插入图片描述
  3. 创建一个类,添加下面的代码


public class Test
{
      public string FieldA { get; set; } 
      public int FieldB { get; set; }
}
public class GraphQLTest :ObjectGraphType<Test>
{  
      public GraphQLTest()
      {
            Field(x => x.FieldA);
            Field(x => x.FieldB);
      
            Field<ListGraphType<GraphQLTest>>("queryTestAll",
            resolve:context=>
            {
                 return tests;
            });
           Field<GraphQLTest>("queryTest"
           arguments:new QueryArguments() {
                  new QueryArgument<IntGraphType>()
                      {
                          Name="fieldB"
                      }
                   },
           resolve: context =>{
                  var fieldB = context.GetArgument<int>("fieldB");
                  return tests.Where(x=>x.FieldB== fieldB).FirstOrDefault();
           });
       }
      List<Test> tests = new List<Test>(){
           new Test(){FieldA="AAA",FieldB=1 },
           new Test(){FieldA="BBB",FieldB=2 },
           new Test(){FieldA="CCC",FieldB=3 }
           };
 }

这样就创建了2个类型,Test这个类相当于Dto层的输出模型。GraphQLTest这个类就是通过GraphQL构建的数据图层中的一个类型了。类型系统后面再讲,这里目的就是通过这个数据图层获取对应的数据。在这个类型中,有一下几点需要注意:
a. 这个类型继承自ObjectGraphType。说明这一个GraphQL类型。泛型T是该类型映 射的对象。

b. 类型中的tests对象。这个是我对仓储层的一个简写。正式项目中,仓储层可以通过依赖注入,通过构造函数注入进来。

c.接下来就是重点了,在这个类的构造函数中调用了4次Field方法,但是这4个方法的作用是不一样的。下面看看这写方法的定义。
在这里插入图片描述

根据传递的参数,可以发现Field(x => x.FieldA);这个调用的是24行的方法,下面2个Field调用的是23行的方法。这2个方法的具体调用只能通过源码看到,暂时使用没有问题就不看源码了,但是可以看到其返回值是不同的。一个是FieldType,一个是FieldBuilder。可以推测,
返回值为FieldBuilder的这些方法,是将基类的泛型T中的属性与GraphQL类型系统中的属性关联起来。
返回值为FieldTyep的这些方法是在当前GraphQL类型中添加FieldType,通过FieldType的name就可以获取到这个字段的值。

d. 返回FieldBuilder的方法只是一个对应关系,暂时没什么说的。但是返回FieldType的方法,首先name是必填的参数,这个参数代表了这个字段的名称。其次比较常用的2个参数是arguments和resolve,arguments代表这个字段解析时候的参数,resolve代表了这个类型是从什么原数据解析而来。
4. 创建一个GraphQL的解析类

public class TestClass
{
    public string TestGraphQL(string query)
    {
        var Schema = new Schema { Query = new GraphQLTest() };
        var executer = new DocumentExecuter();
        var result = executer.ExecuteAsync(
             options=>
             {
                options.Schema = Schema;
                 options.Query = query;
             }).Result;
        var json = new DocumentWriter(indent: true).Write(result);
        return json;
     }
}

上面这个类里面,主要操作在TestGraphQL中,首先要创建一个Schema,然后需要给Schema的Query属性赋值。Query的类型也是IObjectGraphType,GraphQL的所有类型的都是基于IObjectGraphType的,给Schema赋值的这个对象和其他继承字ObjectGraphQL的类型的对象也都是一样的,不过这个Query属性为整个数据图提供了一个入口。然后还有两个对象,一个DocumentExecuter,一个DocumentWriter,这2个对象能够根据Schema,将对应的查询语句转换成所需要的数据结果。
5. 测试

static void Main(string[] args)
{
    TestClass test = new TestClass();
    string query1 = @"query{
                      queryTestAll{
                         fieldB
                         fieldA
                         }
                      }";
     Console.WriteLine("query1 Result:");
     Console.WriteLine(test.TestGraphQL(query1));
     string query2 = @"query{  queryTest(fieldB:1){
                              fieldA
                               }}";
     Console.WriteLine("query2 Result:");
     Console.WriteLine(test.TestGraphQL(query2));
     Console.Read();
 }

在main中输入如上代码,即可看到结果:

在这里插入图片描述

query1对应的是2个字段的列表,故返回了2个字段。
query2对应的是1个参数1个字段的查询,故根据参数查询出了1条字有1个字段的结果。
本来结果是返回所有数据的,但是通过GraphQL这层转换之后,返回的只有查询语句所需要的数据了。
以上已经对GraphQL在AspNetCore中的用法进行了一个简单的介绍。下面一章将搭建一个基于GraphQL的Api站点,以及如何使用GraphiQL生成文档。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值