DDD: จะวางตัวจัดการเหตุการณ์ของโดเมนได้ที่ไหน


13

คุณช่วยบอกความเห็นของคุณว่าเลเยอร์ตัวไหนที่ถูกต้องในการวางตัวจัดการเหตุการณ์ของโดเมนใน DDD ตัวอย่างเช่นฉันมีบริการแอปพลิเคชันเพื่อเพิ่มสัญญาใหม่และฉันต้องการส่งการแจ้งเตือนทางอีเมลไปยังบุคคลที่ติดต่อเมื่อมีการเพิ่มสัญญาดังนั้นผู้ส่งอีเมล (ที่จัดการกับ ContractAdded) แอปพลิเคชันบริการหรือบริการโดเมนหรือ อื่น ๆ อีก?

คำตอบ:


12

ฉันวางตัวจัดการเหตุการณ์โดเมนในเลเยอร์แอปพลิเคชัน

เหตุการณ์โดเมนเป็นวิธีที่จะบอกเลเยอร์ภายนอก (หรือโลกภายนอก) ว่ามีบางอย่างเกิดขึ้นในเลเยอร์โดเมน สิ่งที่ต้องทำกับเหตุการณ์ขึ้นอยู่กับแอปพลิเคชัน แอปพลิเคชันอาจแจ้งผู้ใช้เกี่ยวกับการเปลี่ยนแปลงหรืออาจเรียกโดเมนอื่นให้ทำอะไรบางอย่าง แอปพลิเคชันมีหน้าที่รับผิดชอบในการจัดการการดำเนินงานของโดเมนโดยตอบสนองต่อการกระทำของผู้ใช้คำขอเว็บหรือกิจกรรมโดเมน


1
+1 สำหรับชั้นแอปพลิเคชัน ในการออกแบบ pub-sub เหตุการณ์โดเมนอาจเปิดใช้งานตรรกะทั่วไปในสถานที่ / ระบบ / microsservices ที่แตกต่างกัน หากสมาชิกรายใดรายหนึ่งเป็นแอปพลิเคชันที่จำลองแบบโดยใช้ DDD เหตุการณ์จะเกิดการประมวลผลบางอย่างในแอปพลิเคชัน / BC การประมวลผลนี้อาจต้องมีการกำหนดเขตธุรกรรมการควบคุมการเข้าถึงการประสานงานซึ่งโดยทั่วไปจะดำเนินการที่ชั้นแอปพลิเคชัน
Paulo Merson

2

หนังสือ DDD ดั้งเดิม (Evans 2004) อธิบายถึงแอปพลิเคชันเลเยอร์เป็นเลเยอร์แบบบางซึ่งออกกำลังกายวัตถุโดเมนเพื่อตอบสนองต่อการกระทำของผู้ใช้ ตัวจัดการเหตุการณ์ทั่วไปสำหรับเหตุการณ์โดเมนจึงไม่อยู่ในเลเยอร์แอปพลิเคชัน

อาจเหมาะสมที่จะวางบางส่วนไว้ในเลเยอร์โดเมนตราบใดที่คุณไม่แยกเลเยอร์โดยการสร้างการขึ้นต่อกัน

หากคุณมีเลเยอร์โครงสร้างพื้นฐานที่อยู่ต่ำกว่าชั้นโดเมนตัวจัดการเหตุการณ์จะไม่สามารถอยู่ที่นั่นได้เพราะจะทำให้เลเยอร์เสียหาย

หากคุณมีเลเยอร์อะแดปเตอร์ที่อยู่เหนือโดเมนเลเยอร์คุณสามารถสร้างตัวจัดการเหตุการณ์ที่นั่น ตรวจสอบสถาปัตยกรรมหกเหลี่ยม


2

IDomainEventHandlerฉันวางโดเมนจัดการเหตุการณ์ในชั้นโดเมนเป็นอินเตอร์เฟซโดเมน

ตัวอย่างของ Domain Event Handler เป็นนโยบายที่สมัครสมาชิกกับกิจกรรมโดเมนบางอย่างเพื่อเริ่มต้นการทำธุรกรรมใหม่ (เช่นเพื่อเรียกคำสั่งโดเมนใหม่) ดังนั้นจึงเหมาะสมที่จะมีในเลเยอร์โดเมนเนื่องจากเกี่ยวข้องกับ ตรรกะทางธุรกิจ

เราอาจนึกถึงตัวอย่างที่ยืนยันคำสั่งซื้อดังนั้นควรสร้างคำขอใบแจ้งหนี้ เรามีเหตุการณ์OrderConfirmedEventที่เกิดขึ้น นโยบายในโดเมนของเราจะเป็นค่าใช้จ่ายในการสมัครรับข้อมูลเหตุการณ์นี้และการสร้างคำสั่งโดเมนRequestInvoiceที่จะจัดการโดยตัวจัดการคำสั่งและจัดการตามนั้น

หากเรามีตัวจัดการเหตุการณ์นี้ในแอปพลิเคชันเลเยอร์มันก็หมายความว่าแอปพลิเคชันเลเยอร์นอกเหนือจากการดำเนินการของผู้ใช้จะจัดการกับตรรกะทางธุรกิจบางอย่างซึ่งดูเหมือนว่าไม่ถูกต้อง

อย่างไรก็ตามเรามี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.