本文章是介绍和记录如何创建GraphQL项目,以及如何使用GraphQL进行数据的相关操作。项目参照GraphQL .Net 的官方文档进行实践
一、项目结构:
为了更好的和原有的项目结合在一起,尽可能减少对原项目的修改。我对项目结构做了如下分层。
二、项目结构分层说明
Contracts层: 项目的接口层,重点存放项目的一些接口。和原项目的分层结构的Contracts一致
Entities层: 实体模型层,存放实体模型。与原有项目的分层结构Entites层一致
GraphQLDemo: 是使用Console控制台应用程序对GraphQL的调用实例
GraphQLs: 使用GraphQL 的模型定义和查询、变更等操作的定义
Services: 提供服务的具体实现层,和原有项目分层中的Services 层一致
Tests: 使用Unit Test 测试调用GraphQL
在这里重点关注 标红的部分的介绍
三、GraphQLs项目介绍:
GraphQLs重点是存储项目的GraphQL操作相关的内容
1.在项目解决方案中,新建程序集,命名为GraphQLs
2. 安装Graphql
NuGet 搜索 GraphQL
3.创建GraphQL 的相关概念
GraphQL有两种方式创建Schema,
-
- 一种是使用Schema First,也就是使用GraphQL Schema Language创建Schema. 可以对比EntityFramework的DB First
- 一种是使用Graph Type定义Schema,可以对比EntityFramework 的Code First
在这里适用Code First定义数据模型,可以与原有的数据服务应用一起使用。可分为以下步骤:
1)定义数据模型:
假设原有的数据模型Book的结构是这样的:
public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Gender { get; set; } }
那么定义对应的GraphQL的数据模型可以是这样的:
public class UserType:ObjectGraphType<User>// 继承自ObjectGraphType,并传递范型User { public UserType()// 在构造函数中,对属性作影射 { Name = "User"; Field(x => x.Id); Field(x => x.Name); Field(x => x.Age); Field(x => x.Gender); } }
2)定义操作模型:
GraphQL的操作分为: Query(Select), Mutation(Create,Update,Delete),Subscription(订阅)
- 定义Query操作
public class Query : ObjectGraphType// 定义Query { private IWrapper wrapper = new Wrapper(); IEnumerable<User> users = null; public Query() { Field<ListGraphType<UserType>>(//在构造函数中定义查询操作 name: "users", //注意这个名字,后边查询的时候需要对应 arguments: new QueryArguments //定义查询参数 { new QueryArgument<StringGraphType> { Name = "name", Description = "The name for the user" }, new QueryArgument<IntGraphType> { Name = "age", Description = "The age for the user" }, new QueryArgument<StringGraphType> { Name = "gender", Description = "The gender for user" } }, resolve: context =>// 定义查询操作的执行 { var usercontext = context.UserContext;// 获取上下文,可在此作用户验证操作 users = wrapper.User.Find(u => true); var name = context.GetArgument<string>("name"); users = users.Where(u => name == null || u.Name == name); var age = context.GetArgument<int?>("age"); users = users.Where(u => age == null || u.Age == age); var gender = context.GetArgument<string>("gender"); users = users.Where(u => gender == null || u.Gender == gender); return users; });
}
}
- 定义Mutation操作
public class Mutation:ObjectGraphType { private IWrapper wrapper = new Wrapper(); IEnumerable<User> users = null; public Mutation() { Field<UserType>( name: "createUser", arguments: new QueryArguments( new QueryArgument<NonNullGraphType<UserInputType>> { Name = "user" } ), resolve: context => { var user = context.GetArgument<User>("user"); return wrapper.User.Add(user); } ); } }
3. 定义GraphSchema
定义GraphSchema就是定义Schema的Query、Mutation、Subscription操作
public class GraphSchema:Schema { public GraphSchema() { Query = new Query(); Mutation