Utiliser une source de code unique pour les mutations standard et imbriquées
Le serveur GraphQL prend en charge 2 comportements :
- Le comportement standard pour les mutations, par défaut
- Les mutations imbriquées, en option
En conséquence, il exposera les types QueryRoot et MutationRoot par défaut, et basculera vers l'exposition d'un unique type Root pour les mutations imbriquées.
Lors de la fourniture des resolvers, nous ne voudrions pas en fournir deux, un pour chaque solution. Il vaut mieux que le même resolver utilisé pour résoudre les champs de Root puisse également résoudre les champs de QueryRoot et MutationRoot.
Détails d'implémentation
Le serveur utilise un objet appelé FieldResolver pour résoudre les champs, et un objet appelé MutationResolver pour exécuter la mutation proprement dite. Le même objet MutationResolver peut être référencé par différents FieldResolvers implémentant différents champs, de sorte que le code n'est implémenté qu'une seule fois et utilisé dans de nombreux endroits, suivant l'approche SOLID.
Nous savons si un champ est une mutation ou non si le FieldResolver déclare un objet MutationResolver pour ce champ, ce qui se fait via la fonction resolveFieldMutationResolverClass.
Par exemple, le champ Root.replyComment fournit l'objet AddCommentToCustomPostMutationResolver. Ce même objet est également utilisé par le champ Comment.reply.
De plus, lors du codage du FieldResolver, les champs racine sont ajoutés uniquement au type Root. Pour le comportement GraphQL standard, le serveur peut récupérer cette configuration, et ajouter automatiquement ces champs à MutationRoot ou à QueryRoot selon s'ils sont des mutations ou non.
En conséquence, étant donné que nous utilisons une source unique pour le code alimentant à la fois le comportement standard et les mutations imbriquées, nous sommes en mesure d'exécuter des requêtes avec des mutations imbriquées sans effort supplémentaire.