2010-10-14 27 views
34

我們如何建模與CQRS/DDD的經典多對多關係?與CQRS的多對多關係的替代方案

我知道DDD和CQRS實現和解決方案都傾向於特定於域,因此可能很難提出這個問題的一般答案。

但是,讓我們假設我們有圖書作者之間的熟悉關係。這是一種經典的多對多關係。

對我來說,似乎最自然的作者是兩個不同的實體各自在自己的聚合根屬於。因此,明確建模它們之間的多對多關係並不是一種好的方法。

我們如何建模AddBookCommand?我們希望能夠添加一本書到我們的圖書館,並不知何故說明一個特定的作者寫這個。我們如何建模(並堅持)這種關係?

也不也不作者似乎是不錯的人選值對象 ...

回答

35

假設都是聚集,副本,需要進書彙總任何作者的數據在添加新書如此任何後續的命令都有足夠的作者數據來處理。現在,如果作者聚合需要有關作者編寫的書的信息,那麼它可以「訂閱」到NewBookAdded事件(從技術上說,由於NewBookAdded事件,您可以將RegisterAsAuthorOfBook命令發送到作者集合)。我推測可以用另一種方式來模擬這種情況,但我並不是那種與書籍作者域密切相關的。

底線是你並不真正存儲多對多,因爲它們不能縮放。你必須開始考慮它們(聚合)作爲發送消息給對方。更大的問題是需要保持一致,並且在什麼時候需要保持一致。我們是否在意作者並沒有即時反映已添加新書的事實,其中他/她是作者?作者想要對他/她所寫的書籍執行哪些不變量(反之亦然)?

另一件事是停止面向數據和更多的行爲導向。書籍和作者集合的行爲是什麼?這將告訴哪些數據需要在哪一點以及如何建模。

http://pastie.org/1220582第一次刺書集合。

+2

謝謝,這真是一個很好的答案!我已經閱讀了許多介紹性的CQRS文獻,但是我只是最近纔開始並且仍然需要進入思維模式:) – 2010-10-14 12:51:00

+7

爲了增加Yves的出色答案,如果您更多地瞭解行爲,那麼您可能會發現或者兩者(或兩者都不)書和作者聚合實際上是價值對象。一旦我開始這樣思考,我發現很多我以前認爲是實體的對象被更好地建模爲值對象,因此更簡單。這一切都取決於當然的背景... – FinnNk 2010-10-16 23:55:19

+0

如果可以,請您更新鏈接嗎?我想這是你的描述的代碼示例。 – ibubi 2017-01-19 09:15:03