โอเค 😎 เรามา สอนเรื่อง AddDomainEvent
กับ Domain Events ใน C# และอธิบายโค้ดตัวอย่างของคุณทีละขั้นตอน
1️⃣ Domain Event คืออะไร?
-
Domain Event คือ เหตุการณ์ (Event) ที่เกิดขึ้นใน Domain Model
-
ใช้สำหรับ แจ้งว่ามีสิ่งสำคัญเกิดขึ้น ในระบบ เช่น
-
Entity ถูกสร้าง / อัปเดต / ลบ
-
User เปลี่ยนสถานะ
-
Payment สำเร็จ
-
-
ช่วยให้ แยกความรับผิดชอบ (Decoupling) ระหว่าง Entity / Domain กับ Application Layer / Event Handlers
2️⃣ AddDomainEvent
คืออะไร?
-
เป็น Method ของ Entity Base Class
-
ใช้ เพิ่ม Domain Event เข้าไปใน Entity
-
หลังจาก Transaction เสร็จ เราสามารถ dispatch events ให้ระบบอื่น ๆ ทำงานตาม
ตัวอย่าง Base Entity:
public abstract class BaseEntity
{
private List<DomainEvent> _domainEvents = new List<DomainEvent>();
public IReadOnlyCollection<DomainEvent> DomainEvents => _domainEvents.AsReadOnly();
protected void AddDomainEvent(DomainEvent eventItem)
{
_domainEvents.Add(eventItem);
}
public void ClearDomainEvents()
{
_domainEvents.Clear();
}
}
3️⃣ ตัวอย่าง Domain Event
public abstract class DomainEvent
{
public DateTime OccurredOn { get; protected set; } = DateTime.UtcNow;
}
public class UpdatedEvent<TEntity> : DomainEvent
{
public TEntity Entity { get; }
public object Request { get; }
public string EventType { get; }
public UpdatedEvent(TEntity entity, object request, string eventType)
{
Entity = entity;
Request = request;
EventType = eventType;
}
}
-
TEntity
→ Entity ที่ถูกอัปเดต -
Request
→ ข้อมูลการอัปเดต (DTO หรือ Command) -
EventType
→ ประเภทของ Event เช่น"Request"
หรือ"Approval"
4️⃣ วิธีใช้ AddDomainEvent
public class Tenant : BaseEntity
{
public string Name { get; set; }
}
var entity = new Tenant { Name = "ACME Corp" };
var request = new { NewName = "ACME Ltd" };
// เพิ่ม Domain Event ว่า Tenant ถูกอัปเดต
entity.AddDomainEvent(new UpdatedEvent<Tenant>(entity, request, "Request"));
// ตรวจสอบ Events
foreach (var e in entity.DomainEvents)
{
Console.WriteLine($"{e.GetType().Name} occurred at {e.OccurredOn}");
}
Output ตัวอย่าง:
UpdatedEvent`1 occurred at 2025-10-08T15:00:00Z
5️⃣ สรุปแนวคิด
-
Entity Base Class → มี List ของ Domain Events
-
Domain Event Class → เป็นตัวแทนเหตุการณ์สำคัญ
-
AddDomainEvent → เพิ่มเหตุการณ์ลงใน Entity
-
Dispatch Event → หลังบันทึก Entity ลง DB แล้วค่อยส่ง Event ไปยัง Handler
💡 ประโยชน์ของ Domain Events:
-
แยกความรับผิดชอบระหว่าง Domain กับ Application Layer
-
ใช้งานกับ CQRS, Event Sourcing, DDD
-
ลด coupling ของโค้ด → Entity ไม่ต้องรู้ว่าใครจะทำงานต่อ
ถ้าคุณอยาก ฉันสามารถทำ Diagram + Flow การทำงานของ AddDomainEvent
+ Handler + CQRS ให้เห็นชัด ๆ ว่า Entity ถูกอัปเดต → Domain Event ถูก Dispatch → Handler ทำงาน
คุณอยากให้ทำไหม?