สถาปัตยกรรม
สถาปัตยกรรมการใช้แหล่งโค้ดเดียวสำหรับ mutations มาตรฐานและ nested mutations

การใช้แหล่งโค้ดเดียวสำหรับ mutations มาตรฐานและ nested mutations

GraphQL server รองรับ 2 รูปแบบการทำงาน:

  1. รูปแบบมาตรฐานสำหรับ mutations ซึ่งเป็นค่าเริ่มต้น
  2. Nested mutations ซึ่งเป็นตัวเลือกเสริม (opt-in)

ด้วยเหตุนี้ จึงจะเปิดเผยประเภท QueryRoot และ MutationRoot ตามค่าเริ่มต้น และสลับไปเปิดเผยประเภท Root เพียงประเภทเดียวสำหรับ nested mutations

เมื่อจัดเตรียม resolvers เราไม่ต้องการจัดเตรียม resolvers สองตัวแยกกันสำหรับแต่ละโซลูชัน การที่ resolver เดียวกันที่ใช้ resolve ฟิลด์ของ Root สามารถ resolve ฟิลด์จาก QueryRoot และ MutationRoot ได้ด้วยนั้นเป็นแนวทางที่ดีกว่า

รายละเอียดการนำไปใช้งาน

Server ใช้ออบเจกต์ชื่อ FieldResolver สำหรับ resolve ฟิลด์ และออบเจกต์ชื่อ MutationResolver สำหรับดำเนินการ mutation จริงๆ ออบเจกต์ MutationResolver เดียวกันสามารถถูกอ้างอิงโดย FieldResolvers หลายตัวที่ implement ฟิลด์ต่างกัน ดังนั้นโค้ดจึงถูก implement เพียงครั้งเดียวและใช้ในหลายที่ ตามแนวทาง SOLID

เราทราบว่าฟิลด์ใดเป็น mutation หรือไม่ หาก FieldResolver ประกาศออบเจกต์ MutationResolver สำหรับฟิลด์นั้น ซึ่งดำเนินการผ่านฟังก์ชัน resolveFieldMutationResolverClass

ตัวอย่างเช่น ฟิลด์ Root.replyComment จัดเตรียมออบเจกต์ AddCommentToCustomPostMutationResolver ออบเจกต์เดียวกันนี้ยังถูกใช้โดยฟิลด์ Comment.reply ด้วย

นอกจากนี้ เมื่อเขียนโค้ด FieldResolver ฟิลด์ root จะถูกเพิ่มไปยังประเภท Rootเท่านั้น สำหรับรูปแบบการทำงาน GraphQL มาตรฐาน server สามารถดึงการกำหนดค่านี้มาและเพิ่มฟิลด์เหล่านี้ไปยัง MutationRoot หรือ QueryRoot โดยอัตโนมัติ ขึ้นอยู่กับว่าฟิลด์เหล่านั้นเป็น mutationsหรือไม่ใช่

ด้วยเหตุนี้ เนื่องจากเราใช้แหล่งโค้ดเดียวสำหรับขับเคลื่อนทั้งรูปแบบมาตรฐานและ nested mutations เราจึงสามารถดำเนินการ queries ที่มี nested mutations ได้โดยไม่ต้องใช้ความพยายามเพิ่มเติม