Как использовать HotChocolate для применения директивы Key к типам объектов в GraphQL

Как использовать HotChocolate для применения директивы Key к типам объектов в GraphQL
Как использовать HotChocolate для применения директивы Key к типам объектов в GraphQL

Оптимизация типов объектов с помощью ключевой директивы в HotChocolate

При использовании GraphQL с HotChocolate вам может потребоваться расширить типы объектов с помощью директив, таких как @ключ директива, чтобы обеспечить совместимость с Apollo Federation. Это особенно важно для федеративных схем, в которых ключи идентифицируют объекты в нескольких службах. Понимание того, как правильно проектировать типы объектов с помощью этих директив, имеет решающее значение.

В этой статье будет показано, как использовать Горячий шоколад для украшения типов объектов с помощью @ключ директива. Мы также рассмотрим конкретные примеры использования кода C# для создания простого Родитель class и как изменить созданную схему GraphQL. Акцент будет сделан на реальных действиях, которые вы можете предпринять для создания этой функциональности.

При использовании HotChocolate для создания типов объектов GraphQL @ключ Директива может не быть применена мгновенно, как ожидалось. Вместо этого схема может создавать простую структуру типов, в которой отсутствуют важные функции, необходимые для объединения. Мы рассмотрим, как решить эту проблему и заставить вашу схему работать должным образом.

Мы также рассмотрим важные задачи настройки, такие как изменение настроек вашего сервера GraphQL и использование правильных Горячий шоколад и Федерация Аполлона пакеты. При правильной настройке вы можете легко применять директивы и обеспечивать правильную федерацию схем для своих сервисов.

Команда Пример использования
[Ключ] В HotChocolate эта команда декорирует тип объекта с помощью @ключ директива. Он определяет, какое поле будет служить уникальным идентификатором типа при работе с Apollo Federation.
[ReferenceResolver] При применении к методу этот атрибут указывает HotChocolate использовать этот метод в качестве разрешения для объединенных типов. Это позволяет извлекать соответствующие данные из федеративных служб через внешние ссылки.
.AddApolloFederation() Эта команда настраивает поддержку Apollo Federation на сервере HotChocolate GraphQL. Необходимо включить функции федеративной схемы, такие как @ключ директива.
.RegisterService() Регистрирует службу, например Родительский репозиторийв DI-контейнере GraphQL. Это позволяет вам внедрять сервисы непосредственно в преобразователь GraphQL.
директива @key(поля: строка!) В модели SDL эта директива определяет основное ключевое поле для федерации. Чтобы включить разрешение объектов между службами, типы объектов должны иметь @ключ директива.
ISchemaAsync.ExecuteAsync() Асинхронно выполняет запрос GraphQL, обычно используемый в модульных тестах, чтобы убедиться, что схема и директивы, такие как @ключ, реализованы должным образом.
[Услуга] Эта функция используется для внедрения зависимостей, таких как репозитории или сервисы, в аргументы метода преобразователя GraphQL, что позволяет извлекать сервисы в HotChocolate.
Утверждать.Содержит() Команда модульного тестирования XUnit используется для проверки правильности определенных строк или директив, таких как @ключ Директива включается в сгенерированную схему GraphQL во время тестов.

Понимание роли ключевых директив в HotChocolate

Первый скрипт объясняет, как реализовать @ключ директива с использованием HotChocolate в C#. Этот скрипт гарантирует, что созданная схема GraphQL содержит @ключ директива о федерации с Федерацией Аполлона. Скрипт начинается с создания Родитель класс и присвоение [Ключ] и [ИДЕНТИФИКАТОР] атрибуты его полей. Эти свойства важны для информирования HotChocolate о необходимости отмечать идентификатор поле в качестве уникального идентификатора сущности. Это крайне важно при создании интегрированного сервиса GraphQL, в котором сущности могут использоваться несколькими сервисами. Отметка этого поля позволяет службе GraphQL разрешать сущность в федеративных запросах.

СправочникРезолвер Функция также является важным компонентом скрипта. Эта статическая функция позволяет HotChocolate разрешить сущность путем поиска Родитель объект в репозитории. Родительский репозиторий зарегистрирован на сервере GraphQL, и Получать метод извлекает родителя по его идентификатор. В загрузочном коде .AddQueryType инструкция регистрирует Запрос Объект, который используется для выполнения запросов GraphQL. RegisterService позволяет внедрять зависимости, такие как ParentRepository, в преобразователи GraphQL. Такая конструкция упрощает поиск данных, сохраняя при этом четкое разделение задач.

Во втором примере используется подход «сначала схема» с использованием GraphQL SDL (язык определения схемы) для определения @ключ директива внутри схемы. Это решение особенно эффективно для команд, которые уже знакомы с синтаксисом SDL GraphQL. В этом примере @ключ директива применяется к Родитель тип, четко обозначающий идентификатор поле в качестве уникального идентификатора. Использование схемы сначала позволяет разработчикам лучше контролировать построение схемы 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 Schema для применения директивы @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
}

Модульное тестирование HotChocolate GraphQL с директивой @key

Вот модульный тест C#, который использует платформу xUnit, чтобы гарантировать, что сервер HotChocolate правильно применяет директиву @key в схеме GraphQL.

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());
    }
}

Улучшение GraphQL с помощью Apollo Federation и HotChocolate

Использование GraphQL с HotChocolate в федеративной среде требует хорошо структурированной сшивки схем. Apollo Federation позволяет разработчикам разделять схемы между несколькими сервисами, сохраняя при этом единый интерфейс. Используя @ключ директиве с HotChocolate вы можете указать, как объекты GraphQL разрешаются в нескольких сервисах. Это делает ваш API более модульным и масштабируемым, что особенно полезно в больших распределенных системах, где несколько команд контролируют различные аспекты схемы GraphQL.

В типичной федеративной схеме такие сущности, как Родитель может существовать во многих службах. Федерация Аполлона использует @ключ директива для уникальной идентификации объекта на основе указанного поля, например идентификатор. Поддержка HotChocolate Apollo Federation гарантирует, что ваш сервис легко интегрируется в более крупную инфраструктуру. Помимо установки ключей, вы можете использовать директивы федерации, например: @расширяет или @внешний для управления полями данных, рассредоточенными по нескольким микросервисам, что обеспечивает большую гибкость настройки GraphQL.

Еще одним ключевым фактором при использовании HotChocolate является оптимизация производительности. Чрезмерная выборка данных — распространенная проблема API GraphQL, особенно в федеративных контекстах. Использование правильных резольверов, таких как СправочникРезолвер описанный ранее, гарантирует, что ваш API доставляет только необходимые данные без чрезмерных поисков. Кроме того, HotChocolate поддерживает расширенные алгоритмы пакетной обработки запросов и кэширования, которые могут повысить скорость и эффективность ответа API в федеративной схеме.

Общие вопросы о HotChocolate и Федерации Apollo

  1. Какую пользу федерация Apollo дает развитию GraphQL?
  2. Apollo Federation позволяет разделить схемы GraphQL на множество сервисов, каждый из которых отвечает за определенный раздел схемы, но при этом сохраняет согласованный API.
  3. Что такое @key директива, используемая в HotChocolate?
  4. @key Директива создает уникальный идентификатор сущности, позволяя ее разрешать в нескольких сервисах GraphQL.
  5. Могу ли я использовать [Key] и [ID] атрибуты вместе в HotChocolate?
  6. Да, [Key] собственность используется для федерации, и [ID] указывает поле как идентификатор в схеме.
  7. Что значит .RegisterService делать в HotChocolate?
  8. .RegisterService Регистрирует службу, например репозиторий, на сервере GraphQL, обеспечивая внедрение зависимостей в ваши преобразователи.
  9. Как вы тестируете схемы GraphQL с помощью HotChocolate?
  10. HotChocolate позволяет тестировать схему с помощью модульных тестов, вызывая схему и проверяя наличие таких директив, как @key в полученном результате.

Завершение процесса федерации

Использование HotChocolate @ключ директива гарантирует, что ваша федеративная Схема GraphQL соответствующим образом настроен для Федерации Аполлона. Этот подход улучшает управление типами объектов и позволяет разрешать объекты между службами.

Настройка вашего сервера GraphQL с помощью HotChocolate и использование таких директив, как @ключ упрощает создание больших распределенных API. Эта стратегия позволяет вам легче расширять свои услуги, сохраняя при этом согласованное и высокопроизводительное сшивание схем.

Ссылки и ресурсы для HotChocolate и Apollo Federation
  1. Подробно рассказывает об использовании @ключ Директива в Apollo Federation и то, как она интегрируется с HotChocolate. Для получения более подробной информации обратитесь к официальной документации HotChocolate по адресу Документы HotChocolate .
  2. Содержит обзор настройки GraphQL с Apollo Federation с использованием HotChocolate. Посмотрите это руководство от Документы Федерации Аполлона для получения дополнительной информации.
  3. Предлагает подробный пример регистрации службы и разрешения запросов в GraphQL с использованием HotChocolate. Более подробную информацию можно найти в этой статье на Интеграция сервиса с горячим шоколадом .