Eine einzige Code-Quelle für Standard- und verschachtelte Mutations verwenden
Der GraphQL-Server unterstützt 2 Verhaltensweisen:
- Das Standardverhalten für Mutations, standardmäßig aktiv
- Verschachtelte Mutations, als optionale Funktion
Dementsprechend werden standardmäßig die Typen QueryRoot und MutationRoot bereitgestellt, und für verschachtelte Mutations wird auf einen einzigen Typ Root umgeschaltet.
Beim Bereitstellen der Resolver möchten wir nicht zwei Resolver anlegen – einen für jede Lösung. Es ist besser, wenn derselbe Resolver, der Felder für Root auflöst, auch Felder von QueryRoot und MutationRoot auflösen kann.
Implementierungsdetails
Der Server verwendet ein Objekt namens FieldResolver, um Felder aufzulösen, sowie ein Objekt namens MutationResolver, um die eigentliche Mutation auszuführen. Dasselbe MutationResolver-Objekt kann von verschiedenen FieldResolvers referenziert werden, die unterschiedliche Felder implementieren, sodass der Code nur einmal implementiert und an vielen Stellen verwendet wird – gemäß dem SOLID-Ansatz.
Ob ein Feld eine Mutation ist oder nicht, erkennen wir daran, ob der FieldResolver ein MutationResolver-Objekt für dieses Feld deklariert – dies geschieht über die Funktion resolveFieldMutationResolverClass.
Zum Beispiel stellt das Feld Root.replyComment das Objekt AddCommentToCustomPostMutationResolver bereit. Dasselbe Objekt wird auch verwendet vom Feld Comment.reply.
Außerdem werden beim Schreiben des FieldResolver die Root-Felder nur dem Typ Root hinzugefügt. Für das Standard-GraphQL-Verhalten kann der Server diese Konfiguration abrufen und diese Felder automatisch entweder MutationRoot oder QueryRoot hinzufügen, je nachdem, ob sie Mutations sind oder nicht.
Da wir somit eine einzige Code-Quelle sowohl für das Standardverhalten als auch für verschachtelte Mutations verwenden, können wir queries mit verschachtelten Mutations ohne zusätzlichen Aufwand ausführen.