Command VS Event

Command với Command Handler là quan hệ 1:1
Event với Event Handler là quan hệ 1:*
Command theo hướng Push, theo thể chủ động, khi tôi muốn làm việc gì đó
Event là pull, theo hướng bị động, khi 1 sự việc đã thực hiện hoàn tất sẽ phát ra event để các subcrible thực hiện

Advertisements

Command những điều nên biết

1 Command chỉ nên là 1 DTO với các properties với các kiểu dữ liệu thuần tuý của ngôn ngữ như: string, int, float, array. Không nên là 1 object điều này giúp Command có khả năng di chuyển nhanh trong hệ thống, lưu xuống queue hay phục hồi lên dễ dàng.
1 Command nên bảo đảm tính không thể thay đổi được của nó, các thuộc tính chỉ nên được set value vào 1 lần tại hàm construct. Không nên thực hiện các hàm set value cho command. Điều này đảm bảo tính đúng đắn của 1 Command ngay từ đầu.
1 Command chỉ gắn với 1 Command Handler mà thôi, nó giúp dễ kiểm soát và thực thi.
Tất cả công việc trong command phải đảm bảo chỉ thực hiện trong 1 transaction mà thôi, để đảm bảo tính consistent của hệ thống.
1 Command phải luôn là đúng. Điều 1: Command phải đúng, Điều 2: nếu command sai thì nhìn lại điều 1 mà đi fix code. do vậy nên validate ngay khi tạo 1 command để đảm bảo nó đúng, và với tính không thể thay đổi, nó sẽ luôn đúng khi di chuyển trong hệ thống.
1 Command chỉ nên là Edit state không nên là Query (CQRS)

Command Bus VS Service Layer

Command bus thật chất chính là service layer nhưng được implement cung cấp thêm các tính năng để giải quyết các điểm yếu của service layer

Command Bus Service Layer
Chung 1 Interface Mỗi service có 1 interface riêng, gần như không có gì chung
Với việc tất cả đều được thực hiện chung 1 interface cho ta khả năng wrap 1 hành động nào trước khi thực hiện 1 Command, như start 1 transaction, validator… Lưu ý: điều này rất quan trọng, tất cả việc thực hiện trong 1 command chỉ nên trong 1 transaction. -khó có thể thêm được phần nào phía trước hay phía sau
1 Command chỉ thực hiện 1 việc, có 1 nhiệm vụ riêng, tăng tính SRP 1 Service thường thực hiện nhiều việc, dễ phụ thuộc vào nhiều domain điều này thường dẫn tới vi phạm tính SRP trong lập trình, cũng như nguyên tắc Open/Close
Hệ thống làm việc thông qua các command, tăng tính Hexagon của hệ thống (1 code có thể được dùng với nhiều endpoint) dễ tiếp cận theo hướng microservice