我明白命令與事件之間的區別,但在很多情況下,您最終會得到冗餘以及實質上相同的兩個類(ThingNameUpdateCommand,ThingNameUpdatedEvent)之間的映射。對於這些簡單的情況,您是否也可以將該事件用作命令?人們是否連載到商店所有命令以及所有事件?對我來說似乎有點多餘。事件源代碼命令與事件
9
A
回答
12
所有很多這種冗餘的是一般的一個原因,你要避免使用兩種不同的目的相同的消息有很多原因:
-
當他們因爲他們改變
- 來源的事件必須進行版本在保存聚合根時會被存儲並重新使用(反序列化)。如果該類也被用作消息,它會讓事情變得有些尷尬。
- 耦合增加,現在命令處理程序,域模型和事件處理程序正在使用相同的類。從事件中解耦命令可以簡化你在路上的生活。
- 最後清晰。命令是以一種要求完成的語言發佈的(通常是命令性的)。事件是發生事件的表徵(通常是過去式)。如果你對這兩種語言使用同一個類,這種語言會變得混亂。
最後,這些只是數據類,它不是這樣的「硬」代碼。有許多方法可以避免一些簡單場景(如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)工作後,我得出的結論是,命令是多餘的。它們僅僅是來自用戶的事件,他們確實按下了該按鈕。您應該以與其他事件完全相同的方式存儲這些數據,因爲它是您不知道的數據,如果您希望在未來的視圖中使用它。您的用戶確實添加了,然後從籃子中刪除該項目或至少嘗試。您稍後可能想要在稍後的日期使用此信息來提醒用戶。
相關問題
- 1. CAB/SCSF命令與事件
- 2. WPF命令與事件觸發命令
- 3. 命令與事件的命名約定
- 4. 命令MouseUp事件
- 5. 事件源代碼 - 刪除事件相關文件
- 6. WPF MVVM事件命令 - 基於事件參數調用命令
- 7. 事件日誌代碼錯誤無法找到事件源?
- 8. MassTransit和事件與命令發佈
- 9. 錯誤與生成後事件命令
- 10. 事件要命令Issua Xamarin.Forms
- 11. 鏈接事件/命令?
- 12. 路由事件和命令
- 13. 聽寫事件jquery命令
- 14. CQRS intent命令事件
- 15. C#事件處理命令
- 16. Node.js事件處理命令
- 17. WebClient事件觸發命令
- 18. 事件代碼:4005
- 19. keydown事件代碼
- 20. WPF事件到命令添加到控制從代碼隱藏
- 21. Visual Studio中後生成事件MT.exe命令失敗,代碼9009
- 22. MVVM Light:將事件綁定到後面代碼中的命令
- 23. 與事件事件
- 24. pygame示例代碼與事件
- 25. 事件與谷歌代碼管理
- 26. jQuery加載事件與我的代碼
- 27. shell命令的源代碼
- 28. linux du命令源代碼
- 29. hadoop命令的源代碼
- 30. VBA的Excel事件編譯錯誤與上一個命令按鈕MouseMove事件
我也傾向於這個方向。我讀了一些關於您希望事件包含執行該任務所需的所有數據的好點,特別是當數據可能來自沒有歷史表示的外部系統時。但是,您也可以簡單地將這一良好實踐應用於Commands。特別是我認爲,如果你想製作非常DDD的東西,那麼在命令或事件之間就不應該有真正的區別。意圖應該清楚,並且您的域外的歷史數據應該包含在內。 – Arwin
我仍然認爲命令是多餘的。我只是打電話給我做功能事件採購。我最近的ES和F#Elm的博客作爲一個完整的系統:http://anthonylloyd.github.io/blog/2016/11/27/event-sourcing – Ant
我也認爲我的區別是使用FP而不是OO 。 ES映射到FP真的很好,和類型是一個自然可擴展的事件模式。不變性也非常適合ES。 – Ant