2009-12-10 38 views
21

據我瞭解,CQRS的一個基本原則是命令應該是以行爲爲中心的,並且在業務或UL中有價值,而不是以數據爲中心的,即CRUD 。我們沒有專注於更新客戶,而是擁有諸如CustomerHasMoved之類的命令。如果您有CRUD屏幕可以糾正某些數據,該怎麼辦?例如,我們需要更改拼錯的客戶名稱。這在業務中並沒有太多價值。這應該是在UpdateCustomer命令的保護下嗎?CQRS和CRUD屏幕

+4

如何讓正確的客戶名稱對業務沒有價值?名稱錯誤可能意味着貨物沒有交付,並且還有其他情況... – Oded 2009-12-11 19:21:52

回答

17

其實,可能有各種原因來更新客戶的名稱。正如你所說的,它可能會拼寫錯誤,或者......你可以結婚並將你的名字改爲你的丈夫。

如果您只有一個UpdateCustomer命令,那麼您將失去最初的意圖,並且您將無法爲每個人執行不同的行爲。如果名稱錯了,它可能與更新數據庫一樣簡單,而如果您的客戶結婚了,您可能需要通知營銷部門,以便他們可以提供折扣。

如果您的實體是純粹的CRUD,那就是沒有您可以與修改屬性相關聯的意圖,那麼就可以擁有UpdateEntityCommand。然後,您可以慢慢轉換到更多任務的基礎上

+1

確切的,那麼該怎麼辦?爲每個可能的場景創建一個命令? – blockhead 2009-12-30 17:12:14

+7

是的,或者至少對於您想要處理的每個場景。在我的示例中,如果需要,稍後您將從CorrectMisspelledCustomerName開始,然後添加MakeCustomerMarried命令。 CQRS是關於行爲,而不是關於更新數據。因此,您不應該有用於更新系統中的東西的通用命令 – Julien 2009-12-31 08:29:17

+0

如果我的客戶擁有所有字段的大屏幕,該怎麼辦?我會發出幾條命令來處理這個問題,或者以某種方式爲此提出某種「行爲」。也許我應該永遠不要顯示所有的領域。 – blockhead 2009-12-31 13:41:33

0

CustomerHasMoved是在更新客戶位置後觸發的事件。此事件更新讀取的數據庫/緩存數據庫。 gui的命令應該是MoveCustomer或類似的東西。我想我會把更新的客戶名稱放在像UpdateCustomer這樣的命令中。

37

我只是想在它彈出時對其進行快速評論。

重要的是要注意,一些對象實際上是CRUD,那是可以的。我可能並不在乎爲什麼我的域名中的名稱發生變化,我將產品發送給用戶,只需要這些數據來打印郵件標籤。訣竅在於使行爲成爲默認行爲,然後在您確定自己不關心原因而不是反過來的情況下恢復到CRUD界面。

Greg

+0

感謝您的輸入@Greg。我全面搜索了一下,看看你對這些類型的CRUD場景有什麼看法。我猜偶爾的CRUD仍然可以在DDD方法中使用,只要絕對沒有你想要捕捉的行爲。 – 2012-10-11 22:50:47

+0

Upvote。我們花錢在這裏獲得功能(維持能力第二)。想要做出完美而美麗的東西,成爲一名藝術家。也像一個人一樣獲得報酬。看到我對朱利安的回答的評論。 – FastAl 2014-07-07 14:12:43