HotChocolate を使用して GraphQL のオブジェクト型に Key ディレクティブを適用する方法

Key Directive

HotChocolate の Key ディレクティブを使用したオブジェクト タイプの最適化

HotChocolate で GraphQL を使用する場合、次のようなディレクティブを使用してオブジェクト タイプを拡張する必要がある場合があります。 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 サーバーに登録されており、 得る メソッドは、そのメソッドによって親を取得します。 。ブートストラップ コードでは、 命令は、 RegisterService を使用すると、ParentRepository のような依存関係を GraphQL リゾルバーに注入できます。この設計により、関心事の明確な分離を維持しながら、データの取得が簡素化されます。

2 番目の例では、スキーマ優先のアプローチを採用し、GraphQL SDL (スキーマ定義言語) を利用して スキーマ内のディレクティブ。このソリューションは、すでに GraphQL の SDL 構文に精通しているチームにとって特に効果的です。この例では、 @鍵 指令が適用されるのは、 タイプを明確に示します フィールドを一意の識別子として使用します。スキーマファーストを使用すると、開発者は C# コードにアクセスすることなく、GraphQL スキーマの構築方法と変更方法をより詳細に制御できるため、大規模なチームにとってより柔軟なオプションになります。

最後に、単体テスト コンポーネントは、コードが意図したとおりに実行されるかどうかを検証します。 xUnit テスト フレームワーク、Assert.The Contains を使用する コマンドにより、結果のスキーマに 指令。このテストでは、スキーマに次のものが存在するかどうかを検証します。 @鍵 ディレクティブを使用して、サービスがフェデレーション用に適切に構成されていることを確認します。単体テストは、特に複数のサービスがシームレスに連携して動作する必要があるフェデレーテッド システムにおいて、GraphQL スキーマまたはリゾルバー メソッドへの変更によって機能が中断されないことを確認するためのベスト プラクティスです。

HotChocolate での GraphQL オブジェクト タイプの Key ディレクティブの実装

このソリューションは、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 の単体テスト

これは、xUnit フレームワークを使用して、HotChocolate サーバーが GraphQL スキーマの @key ディレクティブを適切に適用することを確認する C# 単体テストです。

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 を利用する際のもう 1 つの重要な要素は、パフォーマンスの最適化です。データのオーバーフェッチは、特にフェデレーション コンテキストにおいて、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 とどのように統合されるかについて説明します。詳細については、次の URL にある HotChocolate の公式ドキュメントを参照してください。 ホットチョコレートのドキュメント
  2. HotChocolate を使用した Apollo Federation での GraphQL の設定の概要を説明します。このガイドは次のサイトから参照してください アポロ連邦のドキュメント 詳細については。
  3. HotChocolate を使用した GraphQL でのサービス登録とクエリ解決の詳細な例を提供します。詳細については、この記事を参照してください。 HotChocolate とのサービス統合