มาเริ่มกันด้วยการทบทวนสั้น ๆ ของปัญหาพื้นที่: หนึ่งในหลักการพื้นฐานของ DDD คือการวางกฎเกณฑ์ทางธุรกิจให้ใกล้เคียงที่สุดกับสถานที่ที่พวกเขาต้องการบังคับใช้ นี่เป็นแนวคิดที่สำคัญอย่างยิ่งเพราะจะทำให้ระบบของคุณ "เหนียว" มากขึ้น การย้ายกฎ "ขึ้นไป" โดยทั่วไปเป็นสัญญาณของแบบจำลองโลหิตจาง ที่ซึ่งวัตถุเป็นเพียงถุงของข้อมูลและกฎจะถูกฉีดด้วยข้อมูลนั้นเพื่อบังคับใช้
แบบจำลองโลหิตจางสามารถสร้างความรู้สึกได้อย่างมากมายสำหรับนักพัฒนาที่เพิ่งเริ่มใช้ DDD คุณสร้างUser
แบบจำลองและแบบEmailMustBeUnqiueRule
ที่ได้รับการฉีดด้วยข้อมูลที่จำเป็นในการตรวจสอบอีเมล ง่าย สง่า ปัญหาคือว่า "ชนิด" ความคิดนี้เป็นขั้นตอนพื้นฐานในธรรมชาติ ไม่ใช่ DDD สิ่งที่เกิดขึ้นคือคุณถูกทิ้งให้อยู่กับโมดูลที่Rules
ห่อหุ้มและห่อหุ้มอย่างเรียบร้อยหลายสิบครั้ง แต่สิ่งเหล่านี้ปราศจากบริบทโดยสิ้นเชิงจนถึงจุดที่ไม่สามารถเปลี่ยนได้อีกต่อไปเพราะมันไม่ชัดเจนเมื่อมีการบังคับใช้ มันสมเหตุสมผลไหม มันอาจจะเห็นได้ชัดว่าตัวเอง EmailMustBeUnqiueRule
จะถูกนำไปใช้ในการสร้างของUser
แต่สิ่งที่เกี่ยวกับUserIsInGoodStandingRule
? อย่างช้า ๆ แต่แน่นอนการแยกเป็นเมล็ดของRules
จากบริบทของพวกเขาทำให้คุณมีระบบที่เข้าใจยาก (และไม่สามารถเปลี่ยนแปลงได้) ควรห่อหุ้มกฎเฉพาะเมื่อการกระทืบ / การประมวลผลที่แท้จริงเกิดขึ้นจริงดังนั้นรูปแบบของคุณจะเริ่มหลวมโฟกัส
ต่อไปนี้สำหรับคำถามเฉพาะของคุณ: ปัญหาของการมีService
/ การCommandHandler
โยนException
คือว่าตรรกะทางธุรกิจของคุณเริ่มรั่ว ("ขึ้นไป") ออกจากโดเมนของคุณ ทำไมService
/ CommandHandler
จำเป็นต้องรู้อีเมลของคุณจะต้องไม่ซ้ำกัน? เลเยอร์บริการแอปพลิเคชันโดยทั่วไปจะใช้สำหรับการประสานงานมากกว่าการใช้งาน เหตุผลนี้สามารถแสดงให้เห็นได้ง่าย ๆ ถ้าเราเพิ่มChangeEmail
เมธอด / คำสั่งลงในระบบของคุณ ตอนนี้ทั้งสองวิธี / ตัวจัดการคำสั่งจะต้องรวมการตรวจสอบที่ไม่ซ้ำกันของคุณ นี่คือที่นักพัฒนาอาจถูกล่อลวงให้ "แยก" EmailMustBeUniqueRule
และ ตามที่อธิบายไว้ข้างต้นเราไม่ต้องการไปเส้นทางนั้น
การบดอัดความรู้เพิ่มเติมบางอย่างสามารถนำเราไปสู่คำตอบ DDD ได้มากขึ้น เอกลักษณ์ของอีเมลคือค่าคงที่ที่จะต้องบังคับใช้กับชุดของUser
วัตถุ มีแนวคิดในโดเมนของคุณที่แสดงถึง "ชุดของUser
วัตถุ" หรือไม่? ฉันคิดว่าคุณอาจจะเห็นว่าฉันกำลังจะไปที่นี่
สำหรับกรณีนี้โดยเฉพาะ (และอื่น ๆ อีกมากมายที่เกี่ยวข้องกับการบังคับใช้ค่าคงที่ทั่วทั้งคอลเลกชัน) Repository
สถานที่ที่ดีที่สุดที่จะใช้ตรรกะนี้จะอยู่ในของคุณ สิ่งนี้สะดวกสบายเป็นพิเศษเพราะRepository
"รู้" ของคุณเป็นส่วนเสริมของโครงสร้างพื้นฐานที่จำเป็นในการดำเนินการตรวจสอบความถูกต้อง (แหล่งข้อมูล) ในกรณีของคุณฉันจะทำการตรวจสอบนี้ในadd
วิธีการ มันสมเหตุสมผลใช่ไหม? แนวคิดนี้เป็นวิธีการที่เพิ่มUser
ระบบของคุณอย่างแท้จริง แหล่งข้อมูลเป็นรายละเอียดการนำไปปฏิบัติ