系列导航

使用Hot Chocolate和.NET 6构建GraphQL应用文章索引

需求

在本文中,我们通过一个简单的例子来看一下如何实现一个最简单的GraphQL的接口。

实现

引入Hot Chocolate依赖包

由于我打算将GraphQL的相关逻辑放到Applicaiton层,并在Application和Api项目中使用,所以在该项目中引入以下依赖包

# Hot Chocolate在.NET Web应用中使用的主要Nuget包
HotChocolate.AspNetCore
# Hot Chocolate集成EntityFramework Core底层ORM框架的Nuget包
HotChocolate.Data.EntityFramework
# Hot Chocolate的一些属性定义扩展
HotChocolate.Data
# 一个可视化的GraphQL Schema中间件
GraphQL.Server.Ui.Voyager

添加Resolver

Api项目中添加文件夹GraphQL用于存放GraphQL接口相关的定义,并新建Query.cs文件,我们在这里定义一个接口:

  • Query.cs
namespace PostGraphi.Api.GraphQL;

public class Query
{
// [Service]是Hot Chocolate提供的用于获取依赖注入对象的属性
public IQueryable<Post> GetPosts([Service] IRepository<Post> repository) => repository.GetAsQueryable();
}

需要在GlobalUsings.cs中添加以下命名空间:

  • GlobalUsings.cs
global using HotChocolate;
global using PostGraphi.Domain.Post.Entities;

添加依赖注入

  1. 添加GraphQL的服务:
builder.Services
.AddGraphQLServer()
.AddQueryType<Query>();
  1. 添加GraphQL终结点配置和Voyager中间件
app.UseHttpsRedirection();

// 添加GraphQL终结点配置
app.UseRouting().UseEndpoints(endpoints =>
{
endpoints.MapGraphQL();
}); // 添加Voyager中间件并配置URL
app.UseGraphQLVoyager(new VoyagerOptions { GraphQLEndPoint = "/graphql" }, "/graphql-voyager"); app.UseAuthentication();
app.UseAuthorization();

验证

运行Api项目,首先我们访问地址:https://localhost:7194/graphql-voyager 查看Voyager的主页:

可以看到我们目前只有一个schema,名称叫做posts,该接口所关联的实体以及实体关联的其他实体组成的图非常清楚地显示出来了。这张图上我们能看到DomainEvents也显示出来了,但这不是我们想要的,这个问题我们稍后来解决。

再去查看Hot Chocolate官方提供的随程序一起启动的Banana Cake Pop主页:https://localhost:7194/graphql/

在这个页面上我们可以查看具体的Schema Definition和全部的GraphQL Server所维护的类型定义。也可以从Operations标签页直接发起GraphQL请求。

query {
posts {
id,
title,
author,
comments {
content
}
tags {
name
}
}
}

如果使用API Client发起GraphQL请求,注意请求是POST https://localhost:7194/graphql,Body内容是GraphQL Query,像这样:

在执行请求之后,我们先来看看控制台的EFCore日志输出:

SELECT "p"."Id", "p"."Abstraction", "p"."Author", "p"."Content", "p"."Created", "p"."CreatedBy", "p"."LastModified", "p"."LastModifiedBy", "p"."Link", "p"."PublishedAt", "p"."Title"
FROM "Posts" AS "p"

敏锐的小伙伴可能会发现,这个sql里并没有看到和Comments和Tags相关的Join之类的操作,下面的通过Banana Cake Pop请求响应也同样能说明这个问题:

在这个返回结果里,我们至少能看到两类问题:一是Comments和Tags这种一对多和多对多的关联表数据并没有同时返回;二是返回似乎没有排序。这两个问题我们会在后面的文章里逐个去解决。

不管怎么样,我们的第一个GraphQL接口已经调用成功了。下面来解决上面说到的DomainEvents的问题。

改进

因为我们默认使用了Annotation First方式去构建接口,并且是直接使用的实体对象,并没有做任何配置,因为我并不想将业务相关的接口属性直接配置到我的Domain Model上,这个时候就需要使用Code First方式去为Post类定义对应的GraphQL类。

Api/GraphQL中新建文件夹Types并创建PostType.cs,让它继承自Hot Chocolate提供的ObjectType<T>类型,并重写Configure方法:

  • PostType.cs
namespace PostGraphi.Api.GraphQL.Types;

public class PostType : ObjectType<Post>
{
protected override void Configure(IObjectTypeDescriptor<Post> descriptor)
{
descriptor.Description("Represents Post Entity Type.");
// 构建schema时忽略这个字段
descriptor.Field(d => d.DomainEvents).Ignore();
}
}

需要在GlobalUsings.cs中引入命名空间:

  • GlobalUsings.cs
global using HotChocolate.Types;

最后在依赖注入的地方添加Type即可:

builder.Services
.AddGraphQLServer()
.AddQueryType<Query>()
.AddType<PostType>();

重新运行程序,我们在Voyager主页上查看,DomainEvents已经消失了:

总结

在本文中我们实现了一个最简单的GraphQL接口,并且使用了Hot Chocolate提供的两种方式Annotation FirstCode First实现了功能。其实关于Code First方式还有一个比较重要的概念叫做Resolver我们在文章演示中没有涉及,这个概念可以理解为通过Code First方式去定义GraphQL对象时,我们可以使用ResolveWith来指定使用什么Resolver去获取数据。更多的配置方法可以参考官方文档:Resolvers

本文我们还留下了两个问题,下一篇文章将会实现关联实体对象的获取方式。

参考文章

  1. Resolvers

使用Hot Chocolate和.NET 6构建GraphQL应用(3) —— 实现Query基础功能的更多相关文章

  1. 使用Hot Chocolate和.NET 6构建GraphQL应用(4) —— 实现Query映射功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在上一篇文章使用Hot Chocolate和.NET 6构建GraphQL应用(3) -- 实现Query基 ...

  2. 使用Hot Chocolate和.NET 6构建GraphQL应用(5) —— 实现Query过滤功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 对于查询来说,还有一大需求是针对查询的数据进行过滤,本篇文章我们准备实现GraphQL中基本的查询过滤. 思 ...

  3. 使用Hot Chocolate和.NET 6构建GraphQL应用(6) —— 实现Query排序功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 从前几篇文章可以看出,使用Hot Chocolate实现GraphQL接口是比较简单的,本篇文章我们继续查询 ...

  4. 使用Hot Chocolate和.NET 6构建GraphQL应用(7) —— 实现Query分页功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 GraphQL中的查询分页相对来说是查询中比较难理解的,接口的Schema也和其他不一样.在这篇文章中,我们 ...

  5. 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引

    系列背景 在进入微服务的实践系列之前,我们一起来学习和实践一下.NET应用开发生态中一些比较重要的技术,这个系列就是关于GraphQL在.NET 6应用中的实现. 系列导航 使用Hot Chocola ...

  6. 使用Hot Chocolate和.NET 6构建GraphQL应用(1)——GraphQL及示例项目介绍

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 前言 这篇文章是这个系列的第一篇,我们会简单地讨论一下GraphQL,然后介绍一下这个系列将会使用的示例项目. 关 ...

  7. 使用Hot Chocolate和.NET 6构建GraphQL应用(2) —— 实体相关功能实现

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在本文中,我们将会准备好用于实现GraphQL接口所依赖的底层数据,为下一篇文章具体实现GraphQL接口做 ...

  8. 使用Hot Chocolate和.NET 6构建GraphQL应用(8) —— 实现Mutate添加数据

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在讨论完GraphQL中的查询需求后,这篇文章我们将演示如何实现GraphQL中的数据添加任务. 思路 在G ...

  9. 使用Hot Chocolate和.NET 6构建GraphQL应用(9) —— 实现Mutate更新数据

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在上一篇文章中,我们演示了如何使用Hot Chocolate进行GraphQL的Mutate新增数据,这篇文 ...

随机推荐

  1. 【LeetCode】198. House Robber 打家劫舍 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 递归 + 记忆化 动态规划 优化动态规划空间 ...

  2. 1122 机器人走方格 V4

    1122 机器人走方格 V4 基准时间限制:1 秒 空间限制:131072 KB  四个机器人a b c d,在2 * 2的方格里,一开始四个机器人分别站在4个格子上,每一步机器人可以往临近的一个格子 ...

  3. javascript原始值和引用值类型及区别

    原始值和引用值类型及区别 首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变. 原始值(简单数据类型) 存储在栈中的简单 ...

  4. 移动端H5-iPhone安全距离适配

    安全区域? 安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners).齐刘海(sensor housing).小黑条(Home Indicator)影响,如下图蓝色区域: 也就是说 ...

  5. Codeforces 919D:Substring(拓扑排序+DP)

    D. Substring time limit: per test3 seconds memory limit: per test256 megabytes inputstandard: input ...

  6. netty系列之:从零到壹,搭建一个SOCKS代理服务器

    目录 简介 使用SSH搭建SOCKS服务器 使用netty搭建SOCKS服务器 encoder和decoder 建立连接 ConnectHandler 总结 简介 上一篇文章,我们讲到了netty对S ...

  7. 精通 MySQL 索引

    索引概念: 概念:索引是提高mysql查询效率的数据结构.总的一句话概括就是索引是一种提高查询效率的数据结构. 数据库查询是数据库的最主要功能之一.设计者们都希望查询数据的速度能尽可能的快,因此数据库 ...

  8. CS5265替代LT8711设计TYPEC转HDMI 4K高清投屏方案|LT8711龙迅替代方案

    龙迅LT8711是一款Type-C/DP1.2 to HDMI2.0方案芯片.LT8711HE是一款高性能Type-C/DP1.2至HDMI2.0转换器,设计用于将USB typec或DP1.2源连接 ...

  9. TYPEC转HDMI+PD+USB3.0拓展坞三合一优化方案|CS5266 dmeoboard原理图

    CS5266 Capstone 是Type-C转HDMI带PD3.0快充的音视频转换芯片. CS5266接收器端口将信道配置(CC)控制器.电源传输(PD)控制器.Billboard控制器和displ ...

  10. Java初学者作业——使用eclipse简单的输出(打印)游戏菜单

    返回本章节 返回作业目录 需求说明: 使用eclipse创建Java项目,在Java程序中输出游戏菜单. 为 Java 程序添加单行和多行注释. 实现思路: 在 eclipse 中创建项目及Java类 ...