2011-07-13 98 views
9

我明白命令與事件之間的區別,但在很多情況下,您最終會得到冗餘以及實質上相同的兩個類(ThingNameUpdateCommand,ThingNameUpdatedEvent)之間的映射。對於這些簡單的情況,您是否也可以將該事件用作命令?人們是否連載到商店所有命令以及所有事件?對我來說似乎有點多餘。事件源代碼命令與事件

回答

12

所有很多這種冗餘的是一般的一個原因,你要避免使用兩種不同的目的相同的消息有很多原因:

    當他們因爲他們改變
  1. 來源的事件必須進行版本在保存聚合根時會被存儲並重新使用(反序列化)。如果該類也被用作消息,它會讓事情變得有些尷尬。
  2. 耦合增加,現在命令處理程序,域模型和事件處理程序正在使用相同的類。從事件中解耦命令可以簡化你在路上的生活。
  3. 最後清晰。命令是以一種要求完成的語言發佈的(通常是命令性的)。事件是發生事件的表徵(通常是過去式)。如果你對這兩種語言使用同一個類,這種語言會變得混亂。

最後,這些只是數據類,它不是這樣的「硬」代碼。有許多方法可以避免一些簡單場景(如code-gen)的輸入。例如,我知道Greg過去使用XML和XSD轉換來創建給定域所需的所有類。

我會說很多簡單的情況下,你可能想問如果這是真正的域(即建模行爲)或只是數據。如果只是數據考慮不在這裏使用事件採購。下面是一個喜歡談話Udi Dahan給出了關於打破你的領域模型的談話,所以並不是所有事情都需要事件採購。我現在自己也符合這種思維方式。

http://skillsmatter.com/podcast/design-architecture/talk-from-udi-dahan

1

通過一些例子,特別是Greg Young的演講(http://www.youtube.com/watch?v=JHGkaShoyNs)工作後,我得出的結論是,命令是多餘的。它們僅僅是來自用戶的事件,他們確實按下了該按鈕。您應該以與其他事件完全相同的方式存儲這些數據,因爲它是您不知道的數據,如果您希望在未來的視圖中使用它。您的用戶確實添加了,然後從籃子中刪除該項目或至少嘗試。您稍後可能想要在稍後的日期使用此信息來提醒用戶。

+0

我也傾向於這個方向。我讀了一些關於您希望事件包含執行該任務所需的所有數據的好點,特別是當數據可能來自沒有歷史表示的外部系統時。但是,您也可以簡單地將這一良好實踐應用於Commands。特別是我認爲,如果你想製作非常DDD的東西,那麼在命令或事件之間就不應該有真正的區別。意圖應該清楚,並且您的域外的歷史數據應該包含在內。 – Arwin

+0

我仍然認爲命令是多餘的。我只是打電話給我做功能事件採購。我最近的ES和F#Elm的博客作爲一個完整的系統:http://anthonylloyd.github.io/blog/2016/11/27/event-sourcing – Ant

+0

我也認爲我的區別是使用FP而不是OO 。 ES映射到FP真的很好,和類型是一個自然可擴展的事件模式。不變性也非常適合ES。 – Ant