Як використовувати HotChocolate для застосування директиви Key до типів об’єктів у GraphQL

Як використовувати HotChocolate для застосування директиви Key до типів об’єктів у GraphQL
Як використовувати HotChocolate для застосування директиви Key до типів об’єктів у GraphQL

Оптимізація типів об’єктів за допомогою ключової директиви в HotChocolate

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

Ця стаття покаже, як використовувати HotChocolate щоб прикрасити типи об’єктів за допомогою @ключ директива. Ми також розглянемо конкретні приклади використання коду C# для створення простого Батько клас і як змінити створену схему GraphQL. Акцент буде зроблено на фактичних діях, які ви можете зробити, щоб створити цю функціональність.

Під час використання HotChocolate для створення типів об’єктів GraphQL, @ключ Директива не може бути застосована миттєво, як очікувалося. Натомість схема може створювати просту структуру типу, у якій відсутні важливі функції, необхідні для об’єднання. Ми розглянемо, як це вирішити, щоб ваша схема працювала належним чином.

Ми також розглянемо найважливіші завдання конфігурації, такі як зміна налаштувань сервера GraphQL і використання правильного HotChocolate і Федерація Аполлон пакети. За допомогою належної конфігурації ви можете легко застосувати директиви та забезпечити належне об’єднання схем для своїх служб.

Команда Приклад використання
[Ключ] У HotChocolate ця команда прикрашає тип об’єкта за допомогою @ключ директива. Він визначає, яке поле слугуватиме унікальним ідентифікатором типу під час роботи з Apollo Federation.
[ReferenceResolver] При застосуванні до методу цей атрибут наказує HotChocolate використовувати цей метод як дозвіл для об’єднаних типів. Це дозволяє отримувати відповідні дані в об’єднаних службах через зовнішні посилання.
.AddApolloFederation() Ця команда налаштовує підтримку Apollo Federation на сервері HotChocolate GraphQL. Необхідно ввімкнути функції об’єднаної схеми, такі як @ключ директива.
.RegisterService() Реєструє службу, наприклад ParentRepository, у контейнері GraphQL DI. Це дозволяє вам вводити служби безпосередньо в резолвер GraphQL.
директива @key(поля: рядок!) У моделі SDL ця директива визначає основне ключове поле для об’єднання. Щоб увімкнути міжсервісне вирішення сутностей, типи об’єктів повинні мати @ключ директива.
ISchemaAsync.ExecuteAsync() Асинхронно виконує запит GraphQL, який зазвичай використовується в модульних тестах, щоб переконатися, що схема та директиви, такі як @ключ, реалізовані належним чином.
[Сервіс] Ця функція використовується для введення залежностей, таких як репозиторії чи служби, в аргументи методу резолвера GraphQL, уможливлюючи пошук служб у HotChocolate.
Assert.Contains() Команда модульного тестування XUnit використовується, щоб переконатися, що певні рядки або директиви, як-от @ключ директиви, включаються в згенеровану схему GraphQL під час тестування.

Розуміння ролі ключових директив у HotChocolate

Перший сценарій пояснює, як реалізувати @ключ директива використання HotChocolate у C#. Цей сценарій гарантує, що створена схема GraphQL містить @ключ директива для федерації з федерацією Apollo. Сценарій починається зі створення a Батько класу та присвоєння в [Ключ] і [ID] атрибутів до його полів. Ці властивості важливі для інформування HotChocolate про позначення id поле як унікальний ідентифікатор сутності. Це має вирішальне значення при створенні об’єднаної служби GraphQL, у якій об’єкти можуть використовуватися кількома службами. Позначення цього поля дозволяє службі GraphQL розпізнавати сутність у об’єднаних запитах.

The ReferenceResolver функція також є важливим компонентом сценарію. Ця статична функція дозволяє HotChocolate розпізнати сутність шляхом пошуку Батько об'єкт у сховищі. The ParentRepository зареєстровано на сервері GraphQL, і отримати метод отримує батьківський елемент за його id. У коді початкового завантаження, .AddQueryType інструкція реєструє Запит об’єкт, який використовується для виконання запитів GraphQL.RegisterService дозволяє впроваджувати залежності, такі як ParentRepository, у резолвери GraphQL. Цей дизайн спрощує пошук даних, зберігаючи чіткий розподіл проблем.

У другому прикладі використовується підхід на основі схеми, використовуючи GraphQL SDL (Schema Definition Language) для визначення @ключ директива в схемі. Це рішення особливо ефективне для команд, які вже знайомі з синтаксисом SDL GraphQL. У цьому прикладі @ключ директива застосовується до Батько типу, чітко вказуючи на id поле як унікальний ідентифікатор. Використання schema-first дозволяє розробникам мати більше контролю над тим, як будується схема GraphQL, і змінювати її, не вдаючись до коду C#, що робить її більш гнучким варіантом для великих команд.

Нарешті, компонент модульного тестування підтверджує, що код працює належним чином. Використовуючи структуру тестування xUnit, Assert.The Contains команда гарантує, що результуюча схема включає @ключ директива. Цей тест перевіряє схему на наявність @ключ директива, яка підтверджує, що службу правильно налаштовано для об’єднання. Модульне тестування є найкращою практикою для того, щоб переконатися, що зміни у схемі GraphQL або методах резолвера не порушують функціональність, особливо в об’єднаній системі, де кілька служб повинні безперебійно працювати разом.

Реалізація директиви Key у 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
}

Модульне тестування 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.

У типовій об’єднаній схемі такі сутності, як Батько може існувати в багатьох службах. Федерація Apollo використовує @ключ директива для унікальної ідентифікації сутності на основі вказаного поля, наприклад id. Підтримка HotChocolate Apollo Federation гарантує, що ваш сервіс легко інтегрується у більшу інфраструктуру. Окрім встановлення ключів, ви можете використовувати директиви об’єднання, наприклад as @extends або @зовнішній для керування полями даних, розподіленими між кількома мікросервісами, забезпечуючи більшу гнучкість налаштування GraphQL.

Іншим ключовим фактором при використанні HotChocolate є оптимізація продуктивності. Надлишок даних є поширеною проблемою API GraphQL, особливо в об’єднаних контекстах. Використовуючи правильні резольвери, такі як ReferenceResolver описаний у попередніх випадках, гарантує, що ваш API надає лише необхідні дані без надмірних пошуків. Крім того, HotChocolate підтримує розширені алгоритми групування запитів і кешування, які можуть збільшити швидкість відповіді API та ефективність у об’єднаній схемі.

Поширені запитання про HotChocolate і Apollo Federation

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

Завершення процесу федерації

Використання HotChocolate @ключ директива гарантує, що ваш федеративний Схема GraphQL належним чином налаштовано для Apollo Federation. Цей підхід покращує керування типами об’єктів і дозволяє розрізняти об’єкти між службами.

Налаштування вашого сервера GraphQL за допомогою HotChocolate та використання таких директив @ключ спрощує створення великих розподілених API. Ця стратегія дозволяє вам легше розширювати свої послуги, зберігаючи послідовне високоефективне з’єднання схем.

Посилання та ресурси для HotChocolate і Apollo Federation
  1. Розробляє питання використання в @ключ директиву в Apollo Federation і як вона інтегрується з HotChocolate. Для отримання додаткової інформації зверніться до офіційної документації HotChocolate за адресою HotChocolate Docs .
  2. Надає огляд налаштування GraphQL з Apollo Federation за допомогою HotChocolate. Перегляньте цей посібник із Документи федерації Apollo для отримання додаткової інформації.
  3. Пропонує детальний приклад реєстрації служби та вирішення запитів у GraphQL за допомогою HotChocolate. Більше можна знайти в цій статті Інтеграція сервісу з HotChocolate .