1
想要對某個聚合進行操作的「用戶/開發者」是否應該面對聚合根目錄?因此,我想調用一個位於該聚合體內部的實體的每個方法是通過根「路由」的嗎?這將使根與很多無聊的代碼有非常廣泛的接口。在DDD中是否應該通過聚合根路由所有呼叫?
或者是否允許遍歷並瀏覽聚集,挑選要處理的實體並直接調用該方法?
或者我是否要求根給我的實體(不允許從外部遍歷和瀏覽聚合),然後直接調用該實體的方法?
想要對某個聚合進行操作的「用戶/開發者」是否應該面對聚合根目錄?因此,我想調用一個位於該聚合體內部的實體的每個方法是通過根「路由」的嗎?這將使根與很多無聊的代碼有非常廣泛的接口。在DDD中是否應該通過聚合根路由所有呼叫?
或者是否允許遍歷並瀏覽聚集,挑選要處理的實體並直接調用該方法?
或者我是否要求根給我的實體(不允許從外部遍歷和瀏覽聚合),然後直接調用該實體的方法?
指定爲聚合「根」的實體是網守,所以所有的方法調用都需要先經過他。如果你仔細想想這是有道理的。如果你派出一個內部實體,你怎麼能確定它是以預定的方式使用的,而不變量是否被支持?此外,現在你的內部細節是耦合的,並且使內部結構變化將在整個系統中漣漪。
請記住,我們努力設計小聚合,所以如果表面積變得太大,可能是您的聚合邊界錯誤的標誌。
很好的答案。我不知道在哪裏,但我記得已經閱讀過,如果短期內使用它們,則可以派發內部實體(通過聚合根)。這隻會耦合實體,而不是內部結構(如何獲得實體)。你會說這是好的嗎?還是你是嚴格的,除了根之外的所有其他的東西都是不可見的,而且是外部未知的?那價值對象呢?我認爲他們可以用作參數並返回值,對嗎? –
是的,交出瞬態參考是完全正確的。因爲值對象是不可變的,所以接受/返回它們也是完全可以接受的。實際上,它們是域的一部分,所以你對聚合的方法應該接受那些是大多數情況。 – Marco
@HolgerThiemann如果實際導航到聚合的內部實體並直接調用方法而不通知根,那麼很可能該實體應該是它自己的聚合根。 – plalx