AspNetCore中GraphQL的用法
一、GraphQL简介
GraphQL不单单是一种查询语言,它为现代应用程序到云服务这一问题提供了一套全面的解决方案。它构成了现代应用程序开发堆栈中一个新的重要层的基础:数据图。这个新的层将公司的所有应用程序数据和服务集中在同一个地方,具有一致、安全且易于使用的界面,因此任何人都能够通过最小的磨合使用它。--------------摘抄至GraphQL开发原则。
二、了解AspNetCore中GraphQL的使用
- 创建一个AspNetCore 控制台程序。
- 添加GraphQL Nuget包。
- 创建一个类,添加下面的代码
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生成文档。