Usar una única fuente de código para mutaciones estándar y anidadas
El servidor GraphQL soporta 2 comportamientos:
- El comportamiento estándar para las mutaciones, por defecto
- Las mutaciones anidadas, como opción que se puede activar
Como consecuencia, expondrá los tipos QueryRoot y MutationRoot por defecto, y cambiará a exponer un único tipo Root para las mutaciones anidadas.
Al proporcionar los resolvers, no querríamos tener que proporcionar dos resolvers, uno para cada solución. Es mejor que el mismo resolver utilizado para resolver campos de Root también pueda resolver campos de QueryRoot y MutationRoot.
Detalles de implementación
El servidor utiliza un objeto llamado FieldResolver para resolver campos, y un objeto llamado MutationResolver para ejecutar la mutación propiamente dicha. El mismo objeto MutationResolver puede ser referenciado por diferentes FieldResolvers que implementan distintos campos, por lo que el código se implementa una sola vez y se utiliza en muchos lugares, siguiendo el enfoque SOLID.
Sabemos si un campo es una mutación o no en función de si el FieldResolver declara un objeto MutationResolver para ese campo, lo cual se hace a través de la función resolveFieldMutationResolverClass.
Por ejemplo, el campo Root.replyComment proporciona el objeto AddCommentToCustomPostMutationResolver. Este mismo objeto también es utilizado por el campo Comment.reply.
Además, al programar el FieldResolver, los campos raíz se añaden únicamente al tipo Root. Para el comportamiento estándar de GraphQL, el servidor puede recuperar esta configuración y añadir automáticamente estos campos a MutationRoot o a QueryRoot según sean mutaciones o no.
Como resultado, al utilizar una única fuente para el código que da soporte tanto al comportamiento estándar como a las mutaciones anidadas, podemos ejecutar consultas con mutaciones anidadas sin esfuerzo adicional.