1️⃣ Domain Event คืออะไร?

By suparat · 08 Oct 2025


โอเค 😎 เรามา สอนเรื่อง 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️⃣ สรุปแนวคิด

  1. Entity Base Class → มี List ของ Domain Events

  2. Domain Event Class → เป็นตัวแทนเหตุการณ์สำคัญ

  3. AddDomainEvent → เพิ่มเหตุการณ์ลงใน Entity

  4. 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 ทำงาน

คุณอยากให้ทำไหม?

1️⃣ Domain Event คืออะไร?
Web hosting by Somee.com