使用 HotChocolate 中的关键指令优化对象类型
将 GraphQL 与 HotChocolate 结合使用时,您可能需要使用指令扩展对象类型,例如 @钥匙 指令,以确保与 Apollo Federation 的兼容性。这对于联合模式尤其重要,其中键标识跨多个服务的实体。了解如何使用这些指令正确设计对象类型至关重要。
本文将展示如何使用 热巧克力 使用来装饰对象类型 @钥匙 指示。我们还将查看利用 C# 代码构建简单的特定示例 家长 类以及如何更改生成的 GraphQL 模式。重点将放在您为创建此功能而可能采取的实际操作上。
当使用 HotChocolate 构造 GraphQL 对象类型时, @钥匙 指令可能不会按预期立即应用。相反,该模式可能会生成缺乏联合所需的关键功能的简单类型结构。我们将讨论如何解决这个问题并使您的架构按预期执行。
我们还将介绍关键的配置任务,例如修改 GraphQL 服务器设置并使用正确的配置 热巧克力 和 阿波罗联盟 包。通过正确的配置,您可以轻松应用指令并确保服务的正确架构联合。
| 命令 | 使用示例 |
|---|---|
| [钥匙] | 在 HotChocolate 中,此命令使用 @钥匙 指示。它定义了在处理 Apollo Federation 时哪个字段将充当类型的唯一标识符。 |
| [参考解析器] | 当应用于方法时,此属性指示 HotChocolate 使用该方法作为联合类型的解析。它允许通过外部引用检索联合服务中的相关数据。 |
| .AddApolloFederation() | 此命令在 HotChocolate GraphQL 服务器中配置 Apollo Federation 支持。有必要启用联合模式功能,例如 @钥匙 指示。 |
| .RegisterService | 注册一个服务,例如 父存储库,在 GraphQL DI 容器中。这允许您将服务直接注入 GraphQL 解析器。 |
| 指令@key(字段:字符串!) | 在SDL模型中,该指令指定联合的主要关键字段。要启用跨服务实体解析,对象类型必须具有 @钥匙 指示。 |
| ISchemaAsync.ExecuteAsync() | 异步执行 GraphQL 查询,常用于单元测试,以确保模式和指令,例如 @钥匙,得到妥善落实。 |
| [服务] | 此功能用于将存储库或服务等依赖项注入到 GraphQL 解析器方法参数中,从而在 HotChocolate 中启用服务检索。 |
| 断言.Contains() | XUnit 的单元测试命令用于确保某些字符串或指令,例如 @钥匙 指令,包含在测试期间生成的 GraphQL 模式中。 |
了解 HotChocolate 中关键指令的作用
第一个脚本解释了如何实现 @钥匙 在 C# 中使用 HotChocolate 指令。该脚本保证创建的 GraphQL 模式包含 @钥匙 与阿波罗联盟的联盟指令。该脚本首先创建一个 家长 类并分配 [钥匙] 和 [ID] 其字段的属性。这些属性对于通知 HotChocolate 标记非常重要 ID 字段作为实体的唯一标识符。这在创建联合 GraphQL 服务时至关重要,其中实体可以在多个服务之间共享。标记此字段允许 GraphQL 服务解析联合查询中的实体。
这 参考解析器 函数也是脚本的重要组成部分。此静态函数使 HotChocolate 能够通过查找实体来解析实体 家长 存储库中的对象。这 父存储库 已注册到 GraphQL 服务器,并且 得到 方法通过其检索父级 ID。在引导程序代码中, .AddQueryType 指令寄存器 询问 对象,用于执行 GraphQL 查询。RegisterService 允许将 ParentRepository 等依赖项注入 GraphQL 解析器。这种设计简化了数据检索,同时保留了明确的关注点分离。
第二个示例采用模式优先的方法,利用 GraphQL SDL(模式定义语言)来定义 @钥匙 架构内的指令。该解决方案对于已经熟悉 GraphQL 的 SDL 语法的团队特别有效。在此示例中, @钥匙 指令适用于 家长 类型,清楚地表明 ID 字段作为唯一标识符。使用模式优先允许开发人员更好地控制 GraphQL 模式的构建方式并对其进行修改,而无需进入 C# 代码,这使其成为大型团队的更灵活的选择。
最后,单元测试组件验证代码是否按预期执行。使用 xUnit 测试框架,Assert.The Contains 命令确保结果模式包括 @钥匙 指示。此测试验证模式是否存在 @钥匙 指令,确认服务已正确配置为联合。单元测试是确保对 GraphQL 架构或解析器方法的更改不会破坏功能的最佳实践,尤其是在多个服务必须无缝协同运行的联合系统中。
在 HotChocolate 中实现 GraphQL 对象类型的关键指令
该解决方案使用 C#、HotChocolate 和 Apollo Federation 从后端修改 GraphQL 架构。
using HotChocolate;using HotChocolate.Types;using HotChocolate.Types.Relay;using Microsoft.Extensions.DependencyInjection;public class Parent{public Parent(string id, string name){Id = id;Name = name;}[Key][ID]public string Id { get; }public string Name { get; }[ReferenceResolver]public static Parent? Get(ParentRepository repository, string id){return repository.GetParent(id);}}public class Query{public Parent GetParent(string id, [Service] ParentRepository repository){return repository.GetParent(id);}}public void ConfigureServices(IServiceCollection services){services.AddGraphQLServer().AddQueryType<Query>().RegisterService<ParentRepository>().AddApolloFederation();}
使用 GraphQL 模式第一种方法来应用 @key 指令
该解决方案使用模式优先方法以及 GraphQL SDL 和 HotChocolate 通过 @key 指令构建自定义模式。
type Parent @key(fields: "id") {id: ID!name: String!}extend type Query {parent(id: ID!): Parent}extend type Mutation {createParent(id: ID!, name: String!): Parent}directive @key(fields: String!) on OBJECT | INTERFACEschema {query: Querymutation: Mutation}
使用 @key 指令对 HotChocolate GraphQL 进行单元测试
下面是一个 C# 单元测试,它使用 xUnit 框架来确保 HotChocolate 服务器正确应用 GraphQL 架构中的 @key 指令。
using Xunit;using HotChocolate.Execution;using Microsoft.Extensions.DependencyInjection;public class ParentTests{[Fact]public async Task ParentSchema_ContainsKeyDirective(){var serviceCollection = new ServiceCollection();serviceCollection.AddGraphQLServer().AddQueryType<Query>().AddApolloFederation();var serviceProvider = serviceCollection.BuildServiceProvider();var schema = await serviceProvider.GetRequiredService<ISchemaAsync>().ExecuteAsync();Assert.Contains("@key(fields: \"id\")", schema.ToString());}}
使用 Apollo Federation 和 HotChocolate 增强 GraphQL
在联合环境中将 GraphQL 与 HotChocolate 结合使用需要结构良好的模式拼接。 Apollo Federation 使开发人员能够跨多个服务划分模式,同时保持统一的接口。使用 @钥匙 使用 HotChocolate 指令,您可以指定如何跨多个服务解析 GraphQL 实体。这使得您的 API 更加模块化和可扩展,这对于多个团队控制 GraphQL 架构不同方面的大型分布式系统尤其有利。
在典型的联合模式中,诸如 家长 可能存在于许多服务中。阿波罗联盟使用 @钥匙 根据指定字段唯一标识实体的指令,例如 ID。 HotChocolate 对 Apollo Federation 的支持可确保您的服务轻松集成到更大的基础设施中。除了设置键之外,您还可以使用联合指令,例如 @扩展 或者 @外部的 管理分散在多个微服务中的数据字段,为您的 GraphQL 设置提供更大的灵活性。
使用 HotChocolate 的另一个关键因素是性能优化。过度获取数据是 GraphQL API 的一个常见问题,特别是在联合上下文中。使用正确的解析器,例如 参考解析器 前面实例中描述的,保证您的 API 仅提供所需的数据,而无需进行过多的搜索。此外,HotChocolate 支持高级查询批处理和缓存算法,这可以提高联合模式中的 API 响应速度和效率。
关于 HotChocolate 和 Apollo Federation 的常见问题
- Apollo Federation 如何有利于 GraphQL 开发?
- Apollo Federation 允许您将 GraphQL 模式拆分为许多服务,每个服务负责模式的一部分,但仍保持一致的 API。
- 什么是 @key HotChocolate 中使用的指令?
- 这 @key 指令为实体创建唯一标识符,使其能够跨多个 GraphQL 服务进行解析。
- 我可以使用吗 [Key] 和 [ID] HotChocolate 中的属性在一起吗?
- 是的, [Key] 财产用于联邦,并且 [ID] 将该字段指定为架构内的标识符。
- 什么是 .RegisterService 用热巧克力做什么?
- .RegisterService 向 GraphQL 服务器注册服务(例如存储库),从而在解析器中启用依赖项注入。
- 如何使用 HotChocolate 测试 GraphQL 模式?
- HotChocolate 通过调用模式并检查类似指令来使用单元测试来启用模式测试 @key 在结果中。
结束联邦进程
使用热巧克力 @钥匙 指令确保您的联邦 GraphQL 架构 已针对 Apollo Federation 进行适当配置。这种方法改进了对象类型管理并允许跨服务实体解析。
使用 HotChocolate 并使用类似指令配置 GraphQL 服务器 @钥匙 简化了大型分布式 API 的构建。此策略使您能够更轻松地扩展服务,同时保持一致的高性能模式拼接。
HotChocolate 和 Apollo Federation 的参考资料和资源
- 详细说明了使用 @钥匙 Apollo Federation 中的指令以及它如何与 HotChocolate 集成。有关更多详细信息,请参阅 HotChocolate 官方文档: 热巧克力文档 。
- 概述如何使用 HotChocolate 通过 Apollo Federation 配置 GraphQL。请参阅本指南 阿波罗联邦文档 了解更多信息。
- 提供使用 HotChocolate 在 GraphQL 中进行服务注册和查询解析的详细示例。更多内容可以在这篇文章中找到 与 HotChocolate 的服务集成 。