设为首页 加入收藏

TOP

GraphQL ---02 GraphQL和C#结合的实战项目(一)
2019-09-17 18:33:44 】 浏览:45
Tags:GraphQL ---02 结合 实战 项目

本文章是介绍和记录如何创建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
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇.net开源工作流ccflow从表数据数.. 下一篇C#集合。

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目