2012-11-20 15 views
1

在CQRS系統中執行命令時發生的事件與命令具有相同的ID,以便它們可以關聯到該命令。通過命令發生的事件身份

我目前在我的CQRS系統中實現了Saga,並且據我瞭解sagas的概念是他們處理特定的事件然後定義和執行命令來完成由Saga代表的過程。

現在我的問題是,佐賀如何知道它正在處理的事件是它正在等待的事件。

我是否應該將傳遞給傳奇中CommandBus的命令的Id存儲爲等待具有相同ID的事件?如果執行命令導致許多不同事件,它們是否都具有相同的ID?

回答

1

對於傳奇故事,組成信息必須有一些相關鍵。有時候,這可能是一個自然的業務域密鑰,例如OrderId。其他時候,全球唯一的密鑰更適合,如Guid。該密鑰將與由該傳奇實現的單個任務相關的消息相關聯。

在你的情況下,似乎這個相關的ID是開始傳奇的命令的ID。

我是否應該將存儲在傳奇中的命令的 命令的Id用於等待具有相同ID的事件?

是的。如果你可以斷言這個ID是唯一的並且完全標識了這個傳奇所實現的任務,那麼這應該是這個傳奇的相關ID。

如果執行命令導致很多不同的事件, 它們都具有相同的ID嗎?

它們都共享相關ID,但我不認爲它是該事件的ID。該事件可能擁有一個單獨的ID,但要使該功能起作用,它必須具有相關ID。

1

我同意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