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

Key Directive

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

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

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

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

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

Команда Приклад використання
У HotChocolate ця команда прикрашає тип об’єкта за допомогою директива. Він визначає, яке поле слугуватиме унікальним ідентифікатором типу під час роботи з Apollo Federation.
При застосуванні до методу цей атрибут наказує HotChocolate використовувати цей метод як дозвіл для об’єднаних типів. Це дозволяє отримувати відповідні дані в об’єднаних службах через зовнішні посилання.
Ця команда налаштовує підтримку Apollo Federation на сервері HotChocolate GraphQL. Необхідно ввімкнути функції об’єднаної схеми, такі як директива.
Реєструє службу, наприклад , у контейнері GraphQL DI. Це дозволяє вам вводити служби безпосередньо в резолвер GraphQL.
У моделі SDL ця директива визначає основне ключове поле для об’єднання. Щоб увімкнути міжсервісне вирішення сутностей, типи об’єктів повинні мати директива.
Асинхронно виконує запит GraphQL, який зазвичай використовується в модульних тестах, щоб переконатися, що схема та директиви, такі як , реалізовані належним чином.
Ця функція використовується для введення залежностей, таких як репозиторії чи служби, в аргументи методу резолвера GraphQL, уможливлюючи пошук служб у HotChocolate.
Команда модульного тестування XUnit використовується, щоб переконатися, що певні рядки або директиви, як-от директиви, включаються в згенеровану схему GraphQL під час тестування.

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

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

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

У другому прикладі використовується підхід на основі схеми, використовуючи GraphQL SDL (Schema Definition Language) для визначення директива в схемі. Це рішення особливо ефективне для команд, які вже знайомі з синтаксисом SDL GraphQL. У цьому прикладі @ключ директива застосовується до типу, чітко вказуючи на поле як унікальний ідентифікатор. Використання 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 використовує директива для унікальної ідентифікації сутності на основі вказаного поля, наприклад . Підтримка HotChocolate Apollo Federation гарантує, що ваш сервіс легко інтегрується у більшу інфраструктуру. Окрім встановлення ключів, ви можете використовувати директиви об’єднання, наприклад as @extends або для керування полями даних, розподіленими між кількома мікросервісами, забезпечуючи більшу гнучкість налаштування GraphQL.

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

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

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

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

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