使用Hot Chocolate和.NET 6构建GraphQL应用(3) —— 实现Query基础功能
系列导航
使用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;
添加依赖注入
- 添加GraphQL的服务:
builder.Services
.AddGraphQLServer()
.AddQueryType<Query>();
- 添加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 First和Code First实现了功能。其实关于Code First方式还有一个比较重要的概念叫做Resolver我们在文章演示中没有涉及,这个概念可以理解为通过Code First方式去定义GraphQL对象时,我们可以使用ResolveWith来指定使用什么Resolver去获取数据。更多的配置方法可以参考官方文档:Resolvers。
本文我们还留下了两个问题,下一篇文章将会实现关联实体对象的获取方式。
参考文章
使用Hot Chocolate和.NET 6构建GraphQL应用(3) —— 实现Query基础功能的更多相关文章
- 使用Hot Chocolate和.NET 6构建GraphQL应用(4) —— 实现Query映射功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在上一篇文章使用Hot Chocolate和.NET 6构建GraphQL应用(3) -- 实现Query基 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(5) —— 实现Query过滤功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 对于查询来说,还有一大需求是针对查询的数据进行过滤,本篇文章我们准备实现GraphQL中基本的查询过滤. 思 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(6) —— 实现Query排序功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 从前几篇文章可以看出,使用Hot Chocolate实现GraphQL接口是比较简单的,本篇文章我们继续查询 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(7) —— 实现Query分页功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 GraphQL中的查询分页相对来说是查询中比较难理解的,接口的Schema也和其他不一样.在这篇文章中,我们 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引
系列背景 在进入微服务的实践系列之前,我们一起来学习和实践一下.NET应用开发生态中一些比较重要的技术,这个系列就是关于GraphQL在.NET 6应用中的实现. 系列导航 使用Hot Chocola ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(1)——GraphQL及示例项目介绍
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 前言 这篇文章是这个系列的第一篇,我们会简单地讨论一下GraphQL,然后介绍一下这个系列将会使用的示例项目. 关 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(2) —— 实体相关功能实现
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在本文中,我们将会准备好用于实现GraphQL接口所依赖的底层数据,为下一篇文章具体实现GraphQL接口做 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(8) —— 实现Mutate添加数据
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在讨论完GraphQL中的查询需求后,这篇文章我们将演示如何实现GraphQL中的数据添加任务. 思路 在G ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(9) —— 实现Mutate更新数据
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在上一篇文章中,我们演示了如何使用Hot Chocolate进行GraphQL的Mutate新增数据,这篇文 ...
随机推荐
- nim_duilib(5)之option
introduction 更多控件用法,请参考 here 和 源码. 本文的代码基于这里 xml文件添加代码 基于上一篇, 继续向basic.xml中添加下面关于Option的代码. xml完整源码在 ...
- 【LeetCode】869. Reordered Power of 2 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计每位数字出现的次数 日期 题目地址:http ...
- 【LeetCode】692. Top K Frequent Words 解题报告(Python)
[LeetCode]692. Top K Frequent Words 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/top ...
- 晴天小猪历险记之Hill(Dijkstra优先队列优化)
描述 这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在.但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求助. ...
- C9软件工程非一线城市面试经验
本人C9软件工程毕业,由于家境一般,不想去一线城市面对天价房价,所以面的都不是互联网大厂. 人生第一面: 2021.11.29 五某汽车 软件工程岗面试 提前3天发了短信,然后拉了一个面试微信群 1. ...
- Adversarial Examples Improve Image Recognition
Xie C, Tan M, Gong B, et al. Adversarial Examples Improve Image Recognition.[J]. arXiv: Computer Vis ...
- CS5211完全替代兼容LT7211|PS8625|CH7511方案|EDP转LVDS|Capstone CS5211
CH7511|LT7211|PS8625替代方案--Capstone CS5211AN 设计EDP转LVDS优势方案原理图+PCB板设计 CH7511|LT7211|PS8625这三款都是专门用于设计 ...
- CS5216PIN TO PIN替换PS8402A方案|PS8402A电路设计原理图|CS5216芯片
PS8402A是HDMI 电平移位器/中继器专为2型双模Display Port(DP++)电缆适配器应用而设计.它设计用于Display Port到DVI或Display Port到HDMI的2型适 ...
- Struts2中通过Ajax传递json数据
1.导入Struts2所需要的jar包 下载Struts2的jar包时,可以下载struts-2.5.13-min-lib.zip,然后放到项目的/WebContent/WEB-INF/lib路径下s ...
- SpringBoot文章合集
SpringBoot文章合集 SpringBoot合集为<尚硅谷雷神SpringBoot2零基础入门(spring boot2)>的学习以及项目中使用知识点进行整理. SpringBoot ...