Arsitektur
ArsitekturMenggunakan satu sumber kode untuk mutasi standar dan bersarang

Menggunakan satu sumber kode untuk mutasi standar dan bersarang

Server GraphQL mendukung 2 perilaku:

  1. Perilaku standar untuk mutasi, secara default
  2. Mutasi bersarang, sebagai opsi yang dapat diaktifkan

Akibatnya, secara default server akan mengekspos tipe QueryRoot dan MutationRoot, dan beralih ke mengekspos tipe Root tunggal untuk mutasi bersarang.

Saat menyediakan resolver, kita tidak ingin menyediakan dua resolver, satu untuk setiap solusi. Lebih baik jika resolver yang sama yang digunakan untuk menyelesaikan field dari Root juga dapat menyelesaikan field dari QueryRoot dan MutationRoot.

Detail implementasi

Server menggunakan objek bernama FieldResolver untuk menyelesaikan field, dan objek bernama MutationResolver untuk mengeksekusi mutasi yang sebenarnya. Objek MutationResolver yang sama dapat direferensikan oleh berbagai FieldResolvers yang mengimplementasikan field berbeda, sehingga kode diimplementasikan hanya sekali dan digunakan di banyak tempat, mengikuti pendekatan SOLID.

Kita mengetahui apakah suatu field adalah mutasi atau bukan jika FieldResolver mendeklarasikan objek MutationResolver untuk field tersebut, yang dilakukan melalui fungsi resolveFieldMutationResolverClass.

Sebagai contoh, field Root.replyComment menyediakan objek AddCommentToCustomPostMutationResolver. Objek yang sama ini juga digunakan oleh field Comment.reply.

Selain itu, saat mengkodekan FieldResolver, field root ditambahkan ke tipe Root saja. Untuk perilaku GraphQL standar, server dapat mengambil konfigurasi ini, dan secara otomatis menambahkan field-field tersebut ke MutationRoot atau QueryRoot tergantung pada apakah itu adalah mutasi atau bukan.

Hasilnya, karena kita menggunakan satu sumber untuk kode yang mendukung perilaku standar maupun mutasi bersarang, kita dapat mengeksekusi queries dengan mutasi bersarang tanpa usaha tambahan.