บทนำ
ในระบบธุรกิจจริง หลายสิ่งไม่ได้เกิดขึ้นเพราะ “มีคนสั่ง” เสมอไป แต่เกิดขึ้นเพราะ เหตุการณ์บางอย่างได้เกิดขึ้นแล้ว
เช่น:
- พนักงานผ่านทดลองงาน
- พนักงานลาออก
- เงินเดือนถูกปรับ
- แผนกถูกยุบ
เหตุการณ์เหล่านี้คือหัวใจของแนวคิดที่เรียกว่า 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 Event | Application / Integration Event |
|---|---|---|
| แหล่งที่มา | Domain Model | Application / 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

