โอเค 😎 เรามา สอนเรื่อง ICommandHandler
ใน C# / .NET กันแบบเข้าใจง่ายและลงมือทำได้เลย
1️⃣ ICommandHandler
คืออะไร?
ICommandHandler
เป็น Pattern ที่ใช้กับ CQRS (Command Query Responsibility Segregation)
-
ใช้สำหรับ จัดการคำสั่ง (Command) เช่น Create, Update, Delete
-
แยกความรับผิดชอบออกจาก Query ที่ใช้แค่ดึงข้อมูล
-
จะทำงานร่วมกับ Command objects ซึ่งเป็น DTO ที่บอกว่า "ฉันต้องการทำอะไร"
โครงสร้างทั่วไป:
public interface ICommandHandler<TCommand>
{
Task Handle(TCommand command);
}
-
TCommand
คือ object ของคำสั่ง เช่นCreateUserCommand
-
Handle
คือ method ที่ทำงานกับคำสั่งนั้น
2️⃣ ตัวอย่าง ICommand
และ ICommandHandler
Step 1: สร้าง Command
public class CreateUserCommand
{
public string Name { get; set; }
public int Age { get; set; }
}
Step 2: สร้าง Handler
public class CreateUserCommandHandler : ICommandHandler<CreateUserCommand>
{
public async Task Handle(CreateUserCommand command)
{
// ตัวอย่าง: บันทึกลง database (จำลองด้วย Console)
Console.WriteLine($"Creating user: {command.Name}, Age: {command.Age}");
// สมมติว่าเป็น async operation
await Task.CompletedTask;
}
}
3️⃣ การเรียกใช้งาน
var command = new CreateUserCommand { Name = "Jen", Age = 25 };
var handler = new CreateUserCommandHandler();
await handler.Handle(command);
// Output: Creating user: Jen, Age: 25
4️⃣ ขยาย: Generic CommandHandler (Optional)
เราสามารถทำให้ Command Handler แบบ Generic รองรับการคืนค่าได้ เช่น
public interface ICommandHandler<TCommand, TResult>
{
Task<TResult> Handle(TCommand command);
}
public class AddNumbersCommand
{
public int A { get; set; }
public int B { get; set; }
}
public class AddNumbersHandler : ICommandHandler<AddNumbersCommand, int>
{
public Task<int> Handle(AddNumbersCommand command)
{
int result = command.A + command.B;
return Task.FromResult(result);
}
}
// ใช้งาน
var command = new AddNumbersCommand { A = 5, B = 3 };
var handler = new AddNumbersHandler();
int sum = await handler.Handle(command);
Console.WriteLine(sum); // 8
✅ สรุป
-
ICommandHandler<T>
→ จัดการ คำสั่ง (Command) -
Handle
→ Method สำหรับประมวลผลคำสั่ง -
แยกชัดเจนจาก Query (ดึงข้อมูล)
-
สามารถทำเป็น Generic เพื่อคืนค่าหรือ async
ถ้าคุณอยาก ฉันสามารถทำ Diagram + Flow การทำงานของ ICommandHandler กับ Command ใน CQRS ให้ดูง่าย ๆ เหมือน Flowchart ให้เข้าใจเร็ว ๆ ได้ด้วย
คุณอยากให้ทำไหม?