เมื่อใช้ DDD และ CRQS ควรเป็นหนึ่งเหตุการณ์ต่อคำสั่งใช่หรือไม่


17

ฉันกำลังมองหาวิธีในการออกแบบแอพพลิเคชั่น ddd ด้วยระเบียบการตั้งค่า

สมมติว่า "ลูกค้า" โดยรวมมีคำสั่งที่กำหนดไว้ว่า "FillProfile" มันจะยกเหตุการณ์ "ProfileFilled" อย่างมีเหตุผล

มีกรณีที่คำสั่งจะเพิ่มมากกว่าเหตุการณ์หรือคำสั่งที่จะเพิ่มเหตุการณ์ที่แตกต่างกันตามตรรกะบางอย่าง? หรือนี่คือความสัมพันธ์แบบ 1 - 1 เสมอ (คำสั่ง 1 จะไม่มีการเพิ่มหรือเป็นเหตุการณ์ประเภทที่กำหนดไว้เสมอ)

ฉันถามสิ่งนี้เพราะถ้านี่เป็นความจริงที่ว่าคำสั่งจะเพิ่มเหตุการณ์เดียวกันฉันสามารถสร้างระบบการประชุมของฉันในความเป็นจริงนั้น ฉันรู้ว่า "RaiseEvent" จะส่งผลให้ "EventRaised" ...


1
หากคำสั่งทำให้ 2 สิ่งเกิดขึ้นคุณอาจคาดหวังให้แต่ละเหตุการณ์ยกเหตุการณ์ขึ้น ProfileGenerated, ProfileSaved, นอกจากนี้เหตุการณ์ใด ๆ ที่อาจทำให้เกิดข้อผิดพลาดซึ่งอาจเพิ่มเหตุการณ์อีกครั้ง
Ewan

นอกจากนี้ยังมีระบบเล็กน้อยที่ใช้ระบบ BeforeCommand, AfterCommand และกิจกรรมอื่น ๆ
Ewan

หรือคำสั่งอาจวนซ้ำเช่น FillProfiles () profileFilled, profileFilled ....
Ewan

@Ewan เพียงแค่ต้องการแก้ไขคุณ เหตุการณ์โดเมนไม่สามารถสร้างข้อผิดพลาด คำสั่งเท่านั้นที่สามารถ กิจกรรมโดเมนหมายความว่ามีบางสิ่งเกิดขึ้นเนื่องจากคำสั่งหมายความว่ามีความตั้งใจที่จะทำให้บางสิ่งเกิดขึ้นซึ่งสามารถปฏิเสธหรือยอมรับได้ กล่าวอีกนัยหนึ่งจะต้องเกิดข้อผิดพลาดก่อนที่จะส่งเหตุการณ์โดเมน (เว้นแต่ว่าเหตุการณ์โดเมนนั้นเกี่ยวข้องกับการบันทึกข้อผิดพลาดแน่นอน)
Ludovic C

คำตอบ:


18

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

  • เหตุการณ์จับ "สิ่งที่สามารถเกิดขึ้นได้" เบื้องต้นในระบบของคุณจากมุมมองของระบบ

  • คำสั่งถูกกำหนดโดยสิ่งที่ผู้ใช้พิจารณาว่าเป็นการดำเนินการจากมุมมองของเขา

และแม้ว่าสิ่งนี้มักจะนำไปสู่คำสั่งและเหตุการณ์สองสามอย่างที่มีการโต้ตอบ 1: 1 มุมมองที่แตกต่างกันเหล่านี้สามารถนำไปสู่คำสั่งที่ใช้งานมากกว่าหนึ่งเหตุการณ์หรือเหตุการณ์ที่แตกต่างกันขึ้นอยู่กับพารามิเตอร์คำสั่ง ฉันสามารถจินตนาการกรณีที่คำสั่งไม่เพิ่มเหตุการณ์เลย แต่นั่นอาจเป็นกรณีที่พิเศษมากไม่ใช่กรณีทั่วไป

ตัวอย่างเช่นบทช่วยสอนกล่าวถึงเหตุการณ์

  • TabOpened
  • DrinksOrdered
  • FoodOrdered

และคำสั่ง

  • OpenTab
  • สถานที่การสั่งซื้อ

ที่นี่คำสั่ง "OpenTab" จะนำไปสู่เหตุการณ์ "TabOpened" แต่คำสั่ง PlaceOrder จะนำไปสู่เหตุการณ์ "DrinksOrdered", "FoodOrdered" หรือทั้งสองอย่าง

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


10

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

ทั้งคำสั่งของคุณเรียกคำสั่งอื่น ๆ และแต่ละคำสั่งจะเริ่มเหตุการณ์ของตัวเอง หรือคำสั่งของคุณทำงานที่แตกต่างกันในตัวมันเองและปัญหาหลายเหตุการณ์ ตัวอย่างเช่น:

RegisterUserCommand

  • User.create (อีเมลรหัสผ่าน) → UserCreatedEvent
  • User.updateProfile (ชื่อ, นามสกุล, สถานที่) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent

จะเกิดอะไรขึ้นถ้าคุณตัดสินใจในภายหลังว่าจะมีUserWasAddedToCrm? เขียนกระแสทั้งหมดของคุณ?
mcintyre321

@ mcintyre321 ค้นหาการออกแบบที่จัดไว้กับกิจกรรมที่เตรียมไว้
Benten

10

คำสั่งเดียวสามารถเพิ่มเหตุการณ์ได้หลายเหตุการณ์ มันเป็นเพียงข้อสรุปเชิงตรรกะของข้อเท็จจริงเดียว: Composite commandมีอยู่

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

ดังนั้นจึงไม่มีอะไรหยุดคุณจากการมีคำสั่งเดียวที่เพิ่มเหตุการณ์ (หรือแม้แต่ไม่มี) หลายเหตุการณ์

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