Sử dụng một nguồn mã duy nhất cho mutation tiêu chuẩn và mutation lồng nhau
GraphQL server hỗ trợ 2 hành vi:
- Hành vi tiêu chuẩn cho mutations, theo mặc định
- Nested mutations, như một tùy chọn bật thêm
Kết quả là, mặc định server sẽ hiển thị các kiểu QueryRoot và MutationRoot, và chuyển sang hiển thị một kiểu Root duy nhất cho nested mutations.
Khi cung cấp các resolver, chúng ta không muốn phải cung cấp hai resolver riêng biệt, mỗi cái cho một giải pháp. Tốt hơn là cùng một resolver được dùng để phân giải các trường của Root cũng có thể phân giải các trường của QueryRoot và MutationRoot.
Chi tiết triển khai
Server sử dụng một đối tượng gọi là FieldResolver để phân giải các trường, và một đối tượng gọi là MutationResolver để thực thi mutation thực sự. Cùng một đối tượng MutationResolver có thể được tham chiếu bởi nhiều FieldResolvers khác nhau triển khai các trường khác nhau, nhờ đó mã nguồn chỉ được triển khai một lần và được dùng ở nhiều nơi, theo phương pháp SOLID.
Chúng ta biết một trường có phải là mutation hay không nếu FieldResolver khai báo một đối tượng MutationResolver cho trường đó, thực hiện thông qua hàm resolveFieldMutationResolverClass.
Ví dụ, trường Root.replyComment cung cấp đối tượng AddCommentToCustomPostMutationResolver. Cùng đối tượng này cũng được sử dụng bởi trường Comment.reply.
Hơn nữa, khi viết mã FieldResolver, các trường root chỉ được thêm vào kiểu Root. Đối với hành vi GraphQL tiêu chuẩn, server có thể truy xuất cấu hình này và tự động thêm các trường đó vào MutationRoot hoặc QueryRoot tùy theo việc chúng là mutations hay không phải.
Kết quả là, vì chúng ta sử dụng một nguồn mã duy nhất cho cả hành vi tiêu chuẩn lẫn nested mutations, chúng ta có thể thực thi queries với nested mutations mà không cần nỗ lực thêm nào.