ตอนที่ 9: Domain Event – เมื่อระบบธุรกิจขับเคลื่อนด้วยเหตุการณ์

บทนำ

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

เช่น:

  • พนักงานผ่านทดลองงาน
  • พนักงานลาออก
  • เงินเดือนถูกปรับ
  • แผนกถูกยุบ

เหตุการณ์เหล่านี้คือหัวใจของแนวคิดที่เรียกว่า Domain Event ใน Domain-Driven Design (DDD)


Domain Event คืออะไร

Domain Event คือ object ที่ใช้แทน “เหตุการณ์สำคัญทางธุรกิจ” ที่ได้เกิดขึ้นแล้วใน Domain

คุณสมบัติสำคัญ:

  • เป็นเหตุการณ์ในอดีต (past tense)
  • มีความหมายทางธุรกิจชัดเจน
  • เกิดจาก Domain Model ไม่ใช่ UI

ตัวอย่าง Domain Event:

  • EmployeePassedProbation
  • EmployeeSalaryAdjusted
  • EmployeeResigned

ทำไม Domain Event ถึงสำคัญ

หากไม่มี Domain Event:

  • ระบบจะ tightly coupled
  • Logic จะกระจุกอยู่ที่ Use Case
  • Feature ใหม่เพิ่มยาก

Domain Event ช่วยให้:

  • ระบบขยายได้โดยไม่ต้องแก้โค้ดเดิม
  • แยกผลกระทบออกจากต้นเหตุ
  • Domain สื่อสารสิ่งที่เกิดขึ้นได้ชัดเจน

ธุรกิจคิดเป็น “เหตุการณ์” ไม่ใช่ “ฟังก์ชัน”


ตัวอย่างจากระบบพนักงาน

เหตุการณ์: พนักงานผ่านทดลองงาน

เมื่อเหตุการณ์นี้เกิดขึ้น:

  • เปลี่ยนสถานะพนักงานเป็น permanent
  • แจ้งฝ่าย payroll
  • ส่งอีเมลแจ้ง HR
  • เปิดสิทธิประโยชน์ใหม่

แทนที่จะเขียนทั้งหมดใน Use Case เดียว

Domain Model จะ:

  • สร้าง Domain Event: EmployeePassedProbation

ส่วนระบบอื่นจะ:

  • subscribe เหตุการณ์นี้ไปจัดการงานของตัวเอง

Domain Event ทำงานร่วมกับ Aggregate อย่างไร

Domain Event:

  • ถูกสร้างภายใน Aggregate
  • สะท้อนการเปลี่ยนแปลง state ที่สำคัญ
  • ไม่ควรรู้ว่าใครจะรับไปใช้

ตัวอย่างเชิงแนวคิด:

Employee Aggregate
  └─ changeStatus()
        └─ raise EmployeePassedProbation event

Domain Event vs Application Event

หัวข้อDomain EventApplication / Integration Event
แหล่งที่มาDomain ModelApplication / Infra
ความหมายธุรกิจเทคนิค / integration
ภาษาภาษา Domainภาษาระบบ

Domain Event ต้องใช้ Ubiquitous Language เสมอ


Domain Event ควรถูก handle ที่ไหน

โดยทั่วไป:

  • Aggregate → สร้าง event
  • Application Service → publish event
  • Event Handler → ทำงานต่อ

Event Handler:

  • ส่ง email
  • เรียก external system
  • update read model

Domain Model ไม่ควรรู้จัก event handler


ข้อควรระวังในการใช้ Domain Event

  • อย่าใช้กับทุกการเปลี่ยนแปลงเล็ก ๆ
  • ใช้เฉพาะเหตุการณ์ที่ธุรกิจ “สนใจจริง”
  • อย่าใส่ logic หนักใน event handler

Domain Event ที่ดี:

  • เล็ก
  • ชัด
  • สื่อความหมายธุรกิจ

สรุป

  • Domain Event คือเหตุการณ์สำคัญทางธุรกิจ
  • ช่วยลด coupling และเพิ่มความยืดหยุ่น
  • ทำให้ระบบคิดและสื่อสารแบบธุรกิจจริง
  • เป็นก้าวสำคัญของระบบที่ scale ได้

ตอนถัดไป เราจะเชื่อมทุกอย่างเข้าด้วยกันด้วย Architecture Patterns (Layered, Clean, Hexagonal) เพื่อปิดแกนหลักของ DDD