Trong CQRS / ES, một lệnh được gửi từ máy khách đến máy chủ và được chuyển đến trình xử lý lệnh thích hợp. Trình xử lý lệnh đó tải một tổng hợp từ kho lưu trữ của nó và gọi một số phương thức trên nó và lưu nó trở lại kho lưu trữ. Sự kiện được tạo ra. Trình xử lý sự kiện / saga / trình quản lý quy trình có thể lắng nghe các sự kiện này để đưa ra các lệnh.
Vì vậy, các lệnh (đầu vào) tạo ra các sự kiện (đầu ra), sau đó có thể cung cấp lại cho hệ thống nhiều lệnh hơn (đầu vào). Bây giờ, có phải thông lệ cho một lệnh không phát ra bất kỳ sự kiện nào, mà là để tranh thủ một lệnh khác? Cách tiếp cận như vậy có thể được sử dụng để buộc thực thi trong một quy trình bên ngoài.
BIÊN TẬP:
Trường hợp sử dụng cụ thể mà tôi có trong tâm trí là việc xử lý các chi tiết thanh toán. Khách hàng gửi PayInvoice
lệnh, có tải trọng bao gồm chi tiết thẻ tín dụng của người dùng. Lệnh PayInvoiceHandler
chuyển một MakeInvoicePayment
lệnh tới một quy trình riêng, chịu trách nhiệm tương tác với cổng thanh toán. Nếu thanh toán thành công, một InvoicePaid
sự kiện được tạo ra. Nếu vì một lý do nào đó, hệ thống gặp sự cố sau khi PayInvoice
lệnh được duy trì nhưng trước khi MakeInvoicePayment
lệnh được duy trì, chúng ta có thể theo dõi điều này bằng tay (không có khoản thanh toán nào được thực hiện). Nếu hệ thống gặp sự cố sau khi MakeInvoicePayment
lệnh vẫn tồn tại nhưng trướcInvoicePaid
sự kiện vẫn tồn tại, chúng tôi có thể gặp tình huống thẻ tín dụng của người dùng bị tính phí nhưng hóa đơn không được gắn cờ là đã được thanh toán. Trong trường hợp đó, tình huống sẽ phải được điều tra thủ công và hóa đơn được đánh dấu thủ công là đã thanh toán.