Оптимізація типів об’єктів за допомогою ключової директиви в 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 | INTERFACEschema {query: Querymutation: 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
- Яку користь приносить Apollo Federation розробці GraphQL?
- Apollo Federation дозволяє вам розділяти схеми GraphQL на багато служб, кожна з яких відповідає за певний розділ схеми, але все одно підтримує послідовний API.
- Що таке @key директива, яка використовується для HotChocolate?
- The @key Директива створює унікальний ідентифікатор для об’єкта, що дає змогу розпізнавати його в кількох службах GraphQL.
- Чи можу я використовувати [Key] і [ID] атрибути разом у HotChocolate?
- Так, [Key] власність використовується для федерації, і [ID] визначає поле як ідентифікатор у схемі.
- Що робить .RegisterService робити в HotChocolate?
- .RegisterService Реєструє службу, наприклад репозиторій, на сервері GraphQL, уможливлюючи впровадження залежностей у ваші резолвери.
- Як ви тестуєте схеми GraphQL за допомогою HotChocolate?
- HotChocolate дозволяє тестувати схему за допомогою модульних тестів, викликаючи схему та перевіряючи директиви, такі як @key в отриманому результаті.
Завершення процесу федерації
Використання HotChocolate @ключ директива гарантує, що ваш федеративний Схема GraphQL належним чином налаштовано для Apollo Federation. Цей підхід покращує керування типами об’єктів і дозволяє розрізняти об’єкти між службами.
Налаштування вашого сервера GraphQL за допомогою HotChocolate та використання таких директив @ключ спрощує створення великих розподілених API. Ця стратегія дозволяє вам легше розширювати свої послуги, зберігаючи послідовне високоефективне з’єднання схем.
Посилання та ресурси для HotChocolate і Apollo Federation
- Розробляє питання використання в @ключ директиву в Apollo Federation і як вона інтегрується з HotChocolate. Для отримання додаткової інформації зверніться до офіційної документації HotChocolate за адресою HotChocolate Docs .
- Надає огляд налаштування GraphQL з Apollo Federation за допомогою HotChocolate. Перегляньте цей посібник із Документи федерації Apollo для отримання додаткової інформації.
- Пропонує детальний приклад реєстрації служби та вирішення запитів у GraphQL за допомогою HotChocolate. Більше можна знайти в цій статті Інтеграція сервісу з HotChocolate .