Architettura
ArchitetturaUtilizzare un'unica sorgente di codice per le mutation standard e annidate

Utilizzare un'unica sorgente di codice per le mutation standard e annidate

Il server GraphQL supporta 2 comportamenti:

  1. Il comportamento standard per le mutation, per impostazione predefinita
  2. Le mutation annidate, come opzione attivabile

Di conseguenza, esporrà i tipi QueryRoot e MutationRoot per impostazione predefinita, e passerà a esporre un unico tipo Root per le mutation annidate.

Nel fornire i resolver, non vorremmo fornirne due, uno per ciascuna soluzione. È meglio che lo stesso resolver utilizzato per risolvere i campi di Root possa risolvere anche i campi di QueryRoot e MutationRoot.

Dettagli di implementazione

Il server utilizza un oggetto chiamato FieldResolver per risolvere i campi, e un oggetto chiamato MutationResolver per eseguire la mutation vera e propria. Lo stesso oggetto MutationResolver può essere referenziato da diversi FieldResolvers che implementano campi differenti, in modo che il codice venga implementato una sola volta e utilizzato in molti punti, seguendo l'approccio SOLID.

Sappiamo se un campo è una mutation o meno se il FieldResolver dichiara un oggetto MutationResolver per quel campo, cosa che avviene tramite la funzione resolveFieldMutationResolverClass.

Ad esempio, il campo Root.replyComment fornisce l'oggetto AddCommentToCustomPostMutationResolver. Questo stesso oggetto è utilizzato anche dal campo Comment.reply.

Inoltre, durante la scrittura del FieldResolver, i campi root vengono aggiunti solo al tipo Root. Per il comportamento GraphQL standard, il server può recuperare questa configurazione e aggiungere automaticamente questi campi a MutationRoot oppure a QueryRoot a seconda che siano mutation o meno.

Di conseguenza, dato che utilizziamo un'unica sorgente per il codice che alimenta sia il comportamento standard sia le mutation annidate, siamo in grado di eseguire query con mutation annidate senza alcuno sforzo aggiuntivo.