已經看過這部影片由Greg Yound在DDD如何在內存變化中實現CQS?
http://www.infoq.com/interviews/greg-young-ddd
我想知道你怎麼能實現命令查詢分離(CQS)與DDD,當你在內存中的變化有哪些?
使用CQS,您有兩個存儲庫,一個用於命令,一個用於查詢。 以及兩個對象組,命令對象和查詢對象。 命令對象只有方法,沒有屬性可以暴露對象的形狀,並且不能用於在屏幕上顯示數據。 另一方面,查詢對象用於在屏幕上顯示數據。
在視頻中,命令總是進入數據庫,因此您可以使用查詢存儲庫來獲取更新的數據並在屏幕上重新顯示。
您可以在ASP.NET中使用類似於和編輯屏幕的CQS,其中在內存中進行了更改,並且屏幕需要隨着更改更新幾次,然後將更改持久保存到數據庫中?
例如
- 我取從查詢信息庫中查詢對象,並在屏幕上顯示出來
- 我點擊編輯
- 我重新獲取距查詢對象庫的查詢對象和顯示它編輯模式下的表格
- 我更改表格上的一個值,該表格自動取消並取回命令對象併發出相關命令
- 如何做:我現在需要顯示更新因爲命令對計算字段進行了更改。由於命令對象尚未保存到數據庫,因此無法使用查詢存儲庫。而且對於CQS,我並不打算暴露命令對象的形狀以顯示在屏幕上。如何獲取查詢對象,並將更新後的更改顯示在屏幕上。
我能想到的幾個可能的解決方案是擁有一個會話存儲庫或從命令對象獲取查詢對象的方法。 或者CQS不適用於這種情況?
在我看來,視頻中的變化直接持續到數據庫中,我還沒有找到一個CQS DDD的例子,它解決了批量更改域對象和更新視圖的問題在最終發出保存域對象的命令之前修改域對象。
感謝您的回覆。 我想知道如果在內存中進行更改時使用CQS,而不是直接持久保存到數據庫,設計有多普遍/好? 這基本上是我們提出的是使用會話存儲庫允許查詢存儲庫通過會話變量訪問命令數據。 稍後可能需要HttpContext存儲庫。 有沒有人見過這個實現?感謝讚賞。 – Ian 2009-10-05 10:43:45
在我看來,你用來操縱數據源的方法不應該依賴於數據源的種類。 Repository模式允許您將這些差異抽象出來,使您可以將任何數據源視爲可查詢的對象集合。這取決於個人存儲庫實現以確定目標數據源 - 因此理論上你會有一個「InMemoryRepository」和「DatabaseRepository」 - 或者你有什麼。 – 2009-10-05 14:32:20
是的,我明白你可以交換數據庫存儲庫的InMemory存儲庫。 CQS的部分價值在於您向數據庫發出命令,並分別使用查詢存儲庫將更新的數據回拉。在內存中,命令對象處於會話中,因此查詢存儲庫只能撤回命令對象中的數據。使用數據庫版本,那麼查詢對象可以完全不同於命令對象,看起來與內存CQS的關係更接近。想知道這與CQS試圖實現什麼相吻合 – Ian 2009-10-06 13:25:11