アーキテクチャ
アーキテクチャ標準ミューテーションとネストされたミューテーションに単一のコードソースを使用する

標準ミューテーションとネストされたミューテーションに単一のコードソースを使用する

GraphQL サーバーは2つの動作をサポートしています。

  1. ミューテーションの標準的な動作(デフォルト)
  2. ネストされたミューテーション(オプトイン)

その結果、デフォルトでは QueryRootMutationRoot の型を公開し、ネストされたミューテーションに対しては単一の Root 型の公開に切り替えます。

リゾルバーを提供する際、それぞれのソリューションに対して2つのリゾルバーを用意したくはありません。Root のフィールドを解決するために使用される同じリゾルバーが、QueryRoot および MutationRoot のフィールドも解決できる方が望ましいです。

実装の詳細

サーバーはフィールドを解決するために FieldResolver というオブジェクトを使用し、実際のミューテーションを実行するために MutationResolver というオブジェクトを使用します。同じ MutationResolver オブジェクトは、異なるフィールドを実装する複数の FieldResolvers から参照できるため、コードは一度だけ実装され、SOLIDアプローチに従って多くの場所で使用されます。

フィールドがミューテーションかどうかは、FieldResolver がそのフィールドに対して MutationResolver オブジェクトを宣言しているかどうかによって判断されます。これは resolveFieldMutationResolverClass 関数を通じて行われます。

たとえば、フィールド Root.replyCommentAddCommentToCustomPostMutationResolver オブジェクトを提供します。この同じオブジェクトはフィールド Comment.reply によっても使用されます

さらに、FieldResolver をコーディングする際、ルートフィールドは Root 型にのみ追加されます。標準的な GraphQL の動作では、サーバーはこの設定を取得し、これらのフィールドがミューテーションであるかそうでないかに応じて、MutationRoot または QueryRoot に自動的に追加できます。

その結果、標準的な動作とネストされたミューテーションの両方を支えるコードに単一のソースを使用しているため、追加の労力なしにネストされたミューテーションを含むクエリを実行できます。