ลองนึกภาพว่าฉันมีกลุ่มและผู้ใช้และเมื่อผู้ใช้ต้องการเข้าร่วมกลุ่มฉันกำลังเรียกใช้วิธี groupsService.AddUserToGroup (กลุ่มผู้ใช้) ใน DDD ฉันควรทำ group.JoinUser (ผู้ใช้) ซึ่งดูดีทีเดียว
แต่ DDD ยังสนับสนุนให้คุณใช้บริการ (ไร้สัญชาติ) ในการทำงานถ้างานในมือนั้นซับซ้อนเกินไปหรือไม่เหมาะกับเอนทิตี้ของแบบจำลอง การมีบริการอยู่ในโดเมนเลเยอร์ แต่บริการในเลเยอร์โดเมนควรมีตรรกะทางธุรกิจเท่านั้น งานภายนอกและตรรกะของแอปพลิเคชัน (เช่นการส่งอีเมล) ในทางกลับกันควรใช้บริการโดเมนในเลเยอร์แอปพลิเคชันซึ่งคุณอาจมีบริการ (แอปพลิเคชัน) แยกต่างหากตัวอย่างเช่น
ปัญหาปรากฏขึ้นหากฉันมีกฎการตรวจสอบความถูกต้องสำหรับการเพิ่มผู้ใช้ ...
กฎการตรวจสอบจะเป็นของโมเดลโดเมน! ควรห่อหุ้มไว้ในวัตถุโดเมน (เอนทิตี ฯลฯ )
... หรืองานภายนอกบางอย่างจำเป็นต้องเริ่มต้นเมื่อมีการเพิ่มผู้ใช้ในกลุ่ม การมีงานเหล่านี้จะนำไปสู่เอนทิตีที่มีการอ้างอิงภายนอก
ในขณะที่ฉันไม่ทราบว่างานภายนอกประเภทใดที่คุณกำลังพูดถึงฉันคิดว่ามันเหมือนกับการส่งอีเมล ฯลฯ แต่นี่ไม่ใช่ส่วนหนึ่งของแบบจำลองโดเมนของคุณ มันควรจะมีชีวิตอยู่ในเลเยอร์แอปพลิเคชัน คุณสามารถมีบริการในชั้นแอปพลิเคชันของคุณซึ่งทำงานกับบริการโดเมนและเอนทิตีเพื่อทำงานเหล่านั้น
แต่ความจริงที่ว่า Entity นั้นขึ้นอยู่กับบริการ / คลาสภายนอกบางอย่างนั้นดูไม่ดีนัก
มันผิดธรรมชาติและไม่ควรเกิดขึ้น กิจการไม่ควรรู้เกี่ยวกับสิ่งที่ไม่รับผิดชอบ ควรใช้บริการเพื่อประสานการโต้ตอบของเอนทิตี
วิธีที่เหมาะสมในการจัดการกับสิ่งนี้ใน DDD คืออะไร?
ในกรณีของคุณความสัมพันธ์ควรเป็นแบบสองทิศทาง ผู้ใช้เข้าร่วมกลุ่มหรือกลุ่มจะนำผู้ใช้ขึ้นอยู่กับโดเมนของคุณ ผู้ใช้เข้าร่วมกลุ่มหรือไม่ หรือผู้ใช้เพิ่มไปยังกลุ่มหรือไม่? มันทำงานอย่างไรในโดเมนของคุณ?
อย่างไรก็ตามคุณมีความสัมพันธ์แบบสองทิศทางและสามารถกำหนดจำนวนกลุ่มที่ผู้ใช้เป็นสมาชิกแล้วภายในกลุ่มผู้ใช้ ไม่ว่าคุณจะส่งผู้ใช้ไปยังกลุ่มหรือกลุ่มไปยังผู้ใช้นั้นเป็นเรื่องไม่สำคัญทางเทคนิคเมื่อคุณได้กำหนดคลาสที่รับผิดชอบแล้ว
การตรวจสอบควรดำเนินการโดยนิติบุคคล สิ่งทั้งหมดเรียกจากบริการของชั้นแอปพลิเคชันซึ่งสามารถทำสิ่งทางเทคนิคเช่นการส่งอีเมล ฯลฯ
อย่างไรก็ตามหากตรรกะการตรวจสอบมีความซับซ้อนจริงๆบริการโดเมนอาจเป็นทางออกที่ดีกว่า ในกรณีนั้นให้แค็ปซูลกฎธุรกิจที่นั่นและเรียกมันจากเลเยอร์แอปพลิเคชันของคุณ