2016-02-03 72 views
1

例如,考慮具有多個菜單的商店。菜單列表項和一個項目可以在多個菜單中列出。聚合根的孩子如何使用來自另一個聚合根的值

想象一個Menu聚合根和Item聚合根。一個菜單將有一個MenuItem的集合,它引用一個Item AR以及特定菜單中的訂購信息。

我的問題是,你將如何從MenuItem訪問項目的名稱,價格,描述。舉個例子,菜單AR處理一個命令,通過價格重新排序(我知道這聽起來與UI相關,但是我在這裏嚴格地講域模型,idk也許這是一個商業規則,菜單必須在特定的方式?)

你會得到一個價值對象的項目AR內的MenuItem?如果是這樣,菜單AR是否保存對域服務的引用以查找該Item的值對象,或者MenuItem是否使用域服務。

我想,菜單AR應始終保持一致,這可能意味着當一個項目被添加到菜單時,MenuItem持有對該項目的值對象的引用。

這樣的聲音會破壞'參考實體的身份'規則,所以MenuItem將持有對ItemId的引用。考慮使用事件採購,無論何時您想要對菜單AR應用命令,它都會重播所有事件使其保持一致,然後發出重新排序菜單項目的命令。

MenuItem只會有一個ItemId而不是該項目的細節,這是否是加載這些項目的時間? Menu可以遍歷它的MenuItems,然後使用服務通過ItemId爲每個MenuItem查找一個Item值對象,然後執行排序。

感謝您的任何意見,非常感謝。

回答

3

就像你說的,這應該可以在查詢方面完成。我不確定我是否知道如何保持域中的順序一致可用?如果菜單有不同的排序策略,也許我會,但即使如此。無論如何...

如果由AR使用的數據不在其邊界內,那麼它可能只會最終保持一致,除非您修改的每個事務通常都是一個不好的做法而不是單個AR。

你可以做這樣的事情:

menu = menuRepository.findById(menuId); 
menu.reorder(itemPricingService); 

有些人還喜歡在應用服務/命令處理程序解決的依賴關係:

menu = menuRepository.findById(menuId); 
itemIdList = menu.items().map(extractItemId); 
itemPriceList = itemPricingService.pricesOf(itemIdList); 
menu.reorder(itemPriceList); 

但是,你也需要聽一個事件如ItemPriceChanged爲了保持菜單順序與價格變化一致。

還有另一種策略,您可以將定價信息複製到MenuItem。價格將根據事件保持最終一致,並且價格改變的項目會發生重新排序。

您可以使用與實施here類似的重新排序策略。看看ProductProductBacklogItemreorderFrom執行情況。

+0

非常感謝您堅持與我作爲商業規則,這只是我想到的第一件事。這有很大的幫助,我認爲你是對的,如果菜單的定價對商業條款中的菜單很重要,那麼MenuItem就可以將價格複製到自身。它只需要像你說的那樣最終保持一致,依靠「ItemPriceChanged」事件保持最新狀態。我必須做更多的研究,因爲如果Menu Menu AR聽到所有MenuItem的ItemPriceChanged事件,那麼這聽起來已經錯了,並且在重放Item時會產生副作用。 – user3228313