Używanie jednego źródła kodu dla standardowych i zagnieżdżonych mutacji
Serwer GraphQL obsługuje 2 zachowania:
- Standardowe zachowanie dla mutacji, domyślnie
- Zagnieżdżone mutacje, jako opcja dodatkowa
W konsekwencji domyślnie udostępnia typy QueryRoot i MutationRoot, a dla zagnieżdżonych mutacji przełącza się na udostępnianie pojedynczego typu Root.
Dostarczając resolvery, nie chcielibyśmy dostarczać dwóch resolverów — jednego dla każdego rozwiązania. Lepiej, żeby ten sam resolver używany do rozwiązywania pól dla Root mógł również rozwiązywać pola z QueryRoot i MutationRoot.
Szczegóły implementacji
Serwer używa obiektu o nazwie FieldResolver do rozwiązywania pól oraz obiektu o nazwie MutationResolver do wykonywania właściwej mutacji. Ten sam obiekt MutationResolver może być przywoływany przez różne obiekty FieldResolver implementujące różne pola, dzięki czemu kod jest implementowany tylko raz i używany w wielu miejscach, zgodnie z podejściem SOLID.
Wiemy, czy dane pole jest mutacją, gdy FieldResolver deklaruje obiekt MutationResolver dla tego pola — odbywa się to za pomocą funkcji resolveFieldMutationResolverClass.
Na przykład pole Root.replyComment dostarcza obiekt AddCommentToCustomPostMutationResolver. Ten sam obiekt jest również używany przez pole Comment.reply.
Ponadto podczas kodowania FieldResolver pola root są dodawane wyłącznie do typu Root. W przypadku standardowego zachowania GraphQL serwer może pobrać tę konfigurację i automatycznie dodać te pola do MutationRoot lub QueryRoot w zależności od tego, czy są mutacjami, czy nie.
W rezultacie, ponieważ używamy jednego źródła kodu obsługującego zarówno zachowanie standardowe, jak i zagnieżdżone mutacje, możemy wykonywać queries z zagnieżdżonymi mutacjami bez żadnego dodatkowego wysiłku.