標準ミューテーションとネストされたミューテーションに単一のコードソースを使用する
GraphQL サーバーは2つの動作をサポートしています。
- ミューテーションの標準的な動作(デフォルト)
- ネストされたミューテーション(オプトイン)
その結果、デフォルトでは QueryRoot と MutationRoot の型を公開し、ネストされたミューテーションに対しては単一の Root 型の公開に切り替えます。
リゾルバーを提供する際、それぞれのソリューションに対して2つのリゾルバーを用意したくはありません。Root のフィールドを解決するために使用される同じリゾルバーが、QueryRoot および MutationRoot のフィールドも解決できる方が望ましいです。
実装の詳細
サーバーはフィールドを解決するために FieldResolver というオブジェクトを使用し、実際のミューテーションを実行するために MutationResolver というオブジェクトを使用します。同じ MutationResolver オブジェクトは、異なるフィールドを実装する複数の FieldResolvers から参照できるため、コードは一度だけ実装され、SOLIDアプローチに従って多くの場所で使用されます。
フィールドがミューテーションかどうかは、FieldResolver がそのフィールドに対して MutationResolver オブジェクトを宣言しているかどうかによって判断されます。これは resolveFieldMutationResolverClass 関数を通じて行われます。
たとえば、フィールド Root.replyComment は AddCommentToCustomPostMutationResolver オブジェクトを提供します。この同じオブジェクトはフィールド Comment.reply によっても使用されます。
さらに、FieldResolver をコーディングする際、ルートフィールドは Root 型にのみ追加されます。標準的な GraphQL の動作では、サーバーはこの設定を取得し、これらのフィールドがミューテーションであるかそうでないかに応じて、MutationRoot または QueryRoot に自動的に追加できます。
その結果、標準的な動作とネストされたミューテーションの両方を支えるコードに単一のソースを使用しているため、追加の労力なしにネストされたミューテーションを含むクエリを実行できます。