ฉันควรใช้คำสั่งหรือเหตุการณ์หรือไม่?


14

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

ลองดูตัวอย่าง:

เมื่อผู้ใช้ใหม่ลงทะเบียนกับเว็บแอปพลิเคชันเราควรสร้างบัญชีให้เขาและส่งอีเมลยืนยัน

การสร้างบัญชี - นี่เป็นจุดที่เหมาะสมในการส่งCreateUserCommandรถบัสและให้ส่วนประกอบเฉพาะจัดการ

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

การส่งอีเมล - หลังจากส่วนประกอบสร้างบัญชีฉันสามารถเห็นความเป็นไปได้ 2 อย่าง

  1. ส่งคำสั่งอื่นไปที่รถบัส SendConfirmationEmailCommand
  2. เผยแพร่กิจกรรม UserAccountCreatedEvent

และปล่อยให้องค์ประกอบของผู้ส่งอีเมลคว้ามันและมันเป็นงาน

ในอีกด้านหนึ่งฉันต้องการอีเมลยืนยันที่จะส่งเพียงครั้งเดียวเท่านั้น (ใช้คำสั่ง) ในทางกลับกันฉันเชื่อว่าอาจมีหลายองค์ประกอบที่สนใจในผู้ใช้ที่ลงทะเบียนใหม่ คนตัดไม้หรือผู้ส่ง SMS

คุณจะใช้มันอย่างไร?

คำตอบ:


16

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

  • คำสั่งต้องการการดำเนินการบางอย่างที่จะดำเนินการโดยโปรเซสเซอร์และการกระทำนี้ควรจะดำเนินการเพียงครั้งเดียวโดยโปรเซสเซอร์นี้

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

ในสถานการณ์ของคุณฉันเข้าใจว่า:

  • CreateUserCommand เป็นคำสั่ง
  • UserAccountCreatedEventเป็นเหตุการณ์ที่ควรออกเมื่อCreateUserCommandบริการการจัดการบัญชีเสร็จสมบูรณ์

ตอนนี้มีความเป็นไปได้สองอย่าง:

  1. บริการการจัดการบัญชีออกมาSendConfirmationEmailCommandบนบัสเนื่องจากคาดว่าคำสั่งนี้จะดำเนินการโดยบริการพิเศษอื่น ๆ
  2. บริการการจัดการบัญชีไม่ได้ทำอะไรมากไปกว่าการส่งการแจ้งเตือนเหตุการณ์เมื่อเสร็จสิ้นและออกไปยังบริการอื่น (เช่นบริการสื่อสารบริการสมัครสมาชิก ฯลฯ ... ) การตัดสินใจว่าจะส่งอีเมล / sms / ฯลฯ ... หรือไม่ จำเป็นต้องมีSendConfirmationEmailCommandคำสั่งเพื่อให้เกตเวย์ดำเนินการ

หากคุณเลือกใช้บริการบัสวิธีนี้จะทำให้รู้สึกถึงการใช้ความยืดหยุ่นที่สิ่งนี้อนุญาตเช่นเลือกตัวเลือกที่ 2


ขอบคุณที่ล้างสิ่งออก คำถามเพิ่มเติมอีกสองข้อเกี่ยวกับตัวเลือกที่ 2: 1. บริการการจัดการบัญชีจะทราบได้อย่างไรเกี่ยวกับความสมบูรณ์ของคำสั่ง ฉันเชื่อว่าเป็นเพราะการฟังเหตุการณ์ที่เผยแพร่โดยบริการพิเศษเมื่อเสร็จสิ้นงานของพวกเขา - อะไรคือวัตถุประสงค์ที่แท้จริงของบริการการจัดการบัญชี เพื่อเผยแพร่เหตุการณ์? ดูเหมือนซ้ำซ้อน 2. ฉันไม่เข้าใจว่าใครควรจะออก SendConfirmationEmailCommand บริการจัดการบัญชีหรือ "บริการอื่น"?
Andrzej Gis

1) ข้อสันนิษฐานของฉันคือบริการการจัดการบัญชีดำเนินงานเองและส่งเหตุการณ์เมื่องานเสร็จสมบูรณ์ (เช่นไม่พบข้อผิดพลาด) แต่คุณถูกต้อง: เป็นไปได้ว่าบริการการจัดการบัญชีส่งคำสั่งของตัวเองไปยังบริการที่มีอยู่ / ฐานข้อมูลและต้องตรวจสอบเหตุการณ์เสร็จสิ้นงาน (เช่นคำตอบแบบอะซิงโครนัส)
Christophe

@gisek 2) ในรถบัสบริการฉันคิดว่าคุณมีบริการพิเศษมากแต่ละคนมีความรับผิดชอบ จำกัด ในกรณีนี้การจัดการบัญชีจะดำเนินการสร้างและแจ้งผู้ที่สนใจเท่านั้น บริการอื่น ๆ จะคอยตรวจสอบสิ่งที่จะตอบสนอง ตัวอย่างเช่นคุณอาจมีผู้จัดการการสื่อสารที่มีหน้าที่รับผิดชอบในการใช้กฎเกณฑ์ทางธุรกิจเพื่อตัดสินใจว่าจะสื่อสารกับผู้ใช้เมื่อใดและอย่างไร หากคุณทำ 1) +2) ในบริการเดียวกันคุณแทบจะไม่ต้องใช้บริการรถบัส
Christophe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.