如何使用 HotChocolate 将 Key 指令应用于 GraphQL 中的对象类型

Key Directive

使用 HotChocolate 中的关键指令优化对象类型

将 GraphQL 与 HotChocolate 结合使用时,您可能需要使用指令扩展对象类型,例如 指令,以确保与 Apollo Federation 的兼容性。这对于联合模式尤其重要,其中键标识跨多个服务的实体。了解如何使用这些指令正确设计对象类型至关重要。

本文将展示如何使用 使用来装饰对象类型 指示。我们还将查看利用 C# 代码构建简单的特定示例 类以及如何更改生成的 GraphQL 模式。重点将放在您为创建此功能而可能采取的实际操作上。

当使用 HotChocolate 构造 GraphQL 对象类型时, 指令可能不会按预期立即应用。相反,该模式可能会生成缺乏联合所需的关键功能的简单类型结构。我们将讨论如何解决这个问题并使您的架构按预期执行。

我们还将介绍关键的配置任务,例如修改 GraphQL 服务器设置并使用正确的配置 和 包。通过正确的配置,您可以轻松应用指令并确保服务的正确架构联合。

命令 使用示例
在 HotChocolate 中,此命令使用 指示。它定义了在处理 Apollo Federation 时哪个字段将充当类型的唯一标识符。
当应用于方法时,此属性指示 HotChocolate 使用该方法作为联合类型的解析。它允许通过外部引用检索联合服务中的相关数据。
此命令在 HotChocolate GraphQL 服务器中配置 Apollo Federation 支持。有必要启用联合模式功能,例如 指示。
注册一个服务,例如 ,在 GraphQL DI 容器中。这允许您将服务直接注入 GraphQL 解析器。
在SDL模型中,该指令指定联合的主要关键字段。要启用跨服务实体解析,对象类型必须具有 指示。
异步执行 GraphQL 查询,常用于单元测试,以确保模式和指令,例如 ,得到妥善落实。
此功能用于将存储库或服务等依赖项注入到 GraphQL 解析器方法参数中,从而在 HotChocolate 中启用服务检索。
XUnit 的单元测试命令用于确保某些字符串或指令,例如 指令,包含在测试期间生成的 GraphQL 模式中。

了解 HotChocolate 中关键指令的作用

第一个脚本解释了如何实现 在 C# 中使用 HotChocolate 指令。该脚本保证创建的 GraphQL 模式包含 @钥匙 与阿波罗联盟的联盟指令。该脚本首先创建一个 类并分配 和 [ID] 其字段的属性。这些属性对于通知 HotChocolate 标记非常重要 字段作为实体的唯一标识符。这在创建联合 GraphQL 服务时至关重要,其中实体可以在多个服务之间共享。标记此字段允许 GraphQL 服务解析联合查询中的实体。

这 函数也是脚本的重要组成部分。此静态函数使 HotChocolate 能够通过查找实体来解析实体 存储库中的对象。这 已注册到 GraphQL 服务器,并且 得到 方法通过其检索父级 。在引导程序代码中, 指令寄存器 对象,用于执行 GraphQL 查询。RegisterService 允许将 ParentRepository 等依赖项注入 GraphQL 解析器。这种设计简化了数据检索,同时保留了明确的关注点分离。

第二个示例采用模式优先的方法,利用 GraphQL SDL(模式定义语言)来定义 架构内的指令。该解决方案对于已经熟悉 GraphQL 的 SDL 语法的团队特别有效。在此示例中, @钥匙 指令适用于 类型,清楚地表明 字段作为唯一标识符。使用模式优先允许开发人员更好地控制 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 | INTERFACE

schema {
    query: Query
    mutation: 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 架构不同方面的大型分布式系统尤其有利。

在典型的联合模式中,诸如 可能存在于许多服务中。阿波罗联盟使用 根据指定字段唯一标识实体的指令,例如 。 HotChocolate 对 Apollo Federation 的支持可确保您的服务轻松集成到更大的基础设施中。除了设置键之外,您还可以使用联合指令,例如 @扩展 或者 管理分散在多个微服务中的数据字段,为您的 GraphQL 设置提供更大的灵活性。

使用 HotChocolate 的另一个关键因素是性能优化。过度获取数据是 GraphQL API 的一个常见问题,特别是在联合上下文中。使用正确的解析器,例如 前面实例中描述的,保证您的 API 仅提供所需的数据,而无需进行过多的搜索。此外,HotChocolate 支持高级查询批处理和缓存算法,这可以提高联合模式中的 API 响应速度和效率。

  1. Apollo Federation 如何有利于 GraphQL 开发?
  2. Apollo Federation 允许您将 GraphQL 模式拆分为许多服务,每个服务负责模式的一部分,但仍保持一致的 API。
  3. 什么是 HotChocolate 中使用的指令?
  4. 这 指令为实体创建唯一标识符,使其能够跨多个 GraphQL 服务进行解析。
  5. 我可以使用吗 和 HotChocolate 中的属性在一起吗?
  6. 是的, 财产用于联邦,并且 将该字段指定为架构内的标识符。
  7. 什么是 用热巧克力做什么?
  8. 向 GraphQL 服务器注册服务(例如存储库),从而在解析器中启用依赖项注入。
  9. 如何使用 HotChocolate 测试 GraphQL 模式?
  10. HotChocolate 通过调用模式并检查类似指令来使用单元测试来启用模式测试 在结果中。

使用热巧克力 指令确保您的联邦 已针对 Apollo Federation 进行适当配置。这种方法改进了对象类型管理并允许跨服务实体解析。

使用 HotChocolate 并使用类似指令配置 GraphQL 服务器 简化了大型分布式 API 的构建。此策略使您能够更轻松地扩展服务,同时保持一致的高性能模式拼接。

  1. 详细说明了使用 Apollo Federation 中的指令以及它如何与 HotChocolate 集成。有关更多详细信息,请参阅 HotChocolate 官方文档: 热巧克力文档
  2. 概述如何使用 HotChocolate 通过 Apollo Federation 配置 GraphQL。请参阅本指南 阿波罗联邦文档 了解更多信息。
  3. 提供使用 HotChocolate 在 GraphQL 中进行服务注册和查询解析的详细示例。更多内容可以在这篇文章中找到 与 HotChocolate 的服务集成