在CQRS系統中執行命令時發生的事件與命令具有相同的ID,以便它們可以關聯到該命令。通過命令發生的事件身份
我目前在我的CQRS系統中實現了Saga,並且據我瞭解sagas的概念是他們處理特定的事件然後定義和執行命令來完成由Saga代表的過程。
現在我的問題是,佐賀如何知道它正在處理的事件是它正在等待的事件。
我是否應該將傳遞給傳奇中CommandBus的命令的Id存儲爲等待具有相同ID的事件?如果執行命令導致許多不同事件,它們是否都具有相同的ID?
在CQRS系統中執行命令時發生的事件與命令具有相同的ID,以便它們可以關聯到該命令。通過命令發生的事件身份
我目前在我的CQRS系統中實現了Saga,並且據我瞭解sagas的概念是他們處理特定的事件然後定義和執行命令來完成由Saga代表的過程。
現在我的問題是,佐賀如何知道它正在處理的事件是它正在等待的事件。
我是否應該將傳遞給傳奇中CommandBus的命令的Id存儲爲等待具有相同ID的事件?如果執行命令導致許多不同事件,它們是否都具有相同的ID?
對於傳奇故事,組成信息必須有一些相關鍵。有時候,這可能是一個自然的業務域密鑰,例如OrderId。其他時候,全球唯一的密鑰更適合,如Guid。該密鑰將與由該傳奇實現的單個任務相關的消息相關聯。
在你的情況下,似乎這個相關的ID是開始傳奇的命令的ID。
我是否應該將存儲在傳奇中的命令的 命令的Id用於等待具有相同ID的事件?
是的。如果你可以斷言這個ID是唯一的並且完全標識了這個傳奇所實現的任務,那麼這應該是這個傳奇的相關ID。
如果執行命令導致很多不同的事件, 它們都具有相同的ID嗎?
它們都共享相關ID,但我不認爲它是該事件的ID。該事件可能擁有一個單獨的ID,但要使該功能起作用,它必須具有相關ID。
我同意eulerfx和想補充一點:如果佐賀的相關型號到一個特定的總結總結的ID就足夠
。
Command: CreateCustomer { CustomerId = New Guid }
- Creates Customer Aggregate with CustomerId
- Emits Event CustomerCreated { CustomerId = Customer.CustomerId }
Command: BlackListCustomer { CustomerId = Customer.CustomerId }
- Blacklists Customer
- Emits Event CustomerBlacklisted { CustomerId = Customer.CustomerId }
Saga: CustomerLifecycle
- Listens to Event CustomerCreated
- Stores created customer's CustomerId
- Listens to Event BlacklistCustomer and only acts if CustomerIds match