DDD中哪个是根聚合根?

4

许多类似订单和订单行的示例很有意义,例如:

Order 是包含 OrderLinesARCustomer 是包含 OrdersAR

问题是,包含 CustomerAR 是什么? 我猜可以是 "商店"。

那么, shop.AddCustomer(customer)...

但是,如何获取商店呢? 如果它是一个AR(实体),它就有一个 ID,所以使用 shop.GetById(shopId)。如果我只有一个商店,这样持久化会怎样工作?

我应该有一张表(shops)只有一行吗? Shop 是一个内存对象,其中包含了一个 Customers 集合?

1个回答

7
你理解错了。聚合根不包含其他聚合!它们只能通过ID引用其他聚合。
聚合是一组密切相关的实体和值对象。聚合以它们周围的一致性边界形成。聚合根是该聚合中全局可寻址的根实体。因此,在你提到的Order和OrderLines的示例中,Order确实可以是聚合根。
另一方面,如果Customer是一个单独的聚合,则只会通过ID引用Orders。
要检索聚合,通常使用Repository。通过指定聚合的ID或其他适当的搜索参数,通过Repository加载聚合。

你在哪个上下文中创建客户? - Bart Calixto
1
@BartCalixto 你可以直接实例化它,也可以使用工厂(如果构建过程不是很简单的话)。然后将新实例化的聚合对象传递给仓储,例如 customerRepo.create(theNewCustomer) - theDmi
1
@Jonathan 这是正确的聚合设计的逻辑结果。它只会返回一个ID列表。如果这对于特定领域来说是一个重大问题,那么聚合边界可能是错误的。这里的分离只是一个例子。 - theDmi
@theDmi 好的,那很有道理,但这里有另一个让我困惑的例子,假设我们有两个聚合根 Author 和 Book。$author->get books() 返回的是书籍 ID 数组还是包含书籍 ID 数组的 BookAggregate 对象? - Jonathan
@Jonathan 我猜你的意思是 $bookRepo->getAllByAuthorId($author->authorId) - inf3rno
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接