【问题标题】:DDD Which is the root Aggregate root?DDD 哪个是根 聚合根?
【发布时间】:2016-03-29 04:13:54
【问题描述】:

订单和订单行等很多示例都很有意义,例如:

Order 是一个包含OrderLinesAR Customer 是一个包含OrdersAR

问题是,包含CustomerAR 是什么? 我想这可能是“商店”之类的东西。

所以,shop.AddCustomer(customer)...

但是,如何获得商店? 如果它是一个 AR(实体),它有一个 id,所以shop.GetById(shopId)。如果我只有一家商店,如何坚持下去?

我应该有一张只有一条线的桌子(商店)吗? Shop 是一个内存中的对象,集合了Customers?

【问题讨论】:

    标签: domain-driven-design aggregateroot


    【解决方案1】:

    你错了。 聚合不包含其他聚合!它们只能通过 ID 引用它们。

    聚合是一组密切相关的实体和值对象。聚合形成围绕它们的一致性边界。 聚合根是聚合中全局可寻址的根实体。因此,在您使用 OrderOrderLines 的示例中,Order 确实可能是 AR。

    另一方面,Customer 如果是单独的聚合,则只会按 ID 引用 Orders

    要检索聚合,您通常使用存储库。您可以通过指定聚合的 ID 或其他一些合适的搜索参数来通过存储库加载聚合。

    【讨论】:

    • 您在什么情况下创建客户?
    • @BartCalixto 您要么直接实例化它,要么使用工厂(如果构造不简单)。然后将新实例化的聚合传递给存储库,例如customerRepo.create(theNewCustomer)
    • @theDmi 当您说 Customer 只会通过 ID 引用订单(例如 $customer->getOrders())时,getOrders() 会仅返回 ID 数组还是返回 Orders 对象?
    • @Jonathan 这是正确聚合设计的逻辑结果。它只会返回一个 ID 列表。如果这是特定域的主要问题,那么聚合边界可能是错误的。这里的分离只是一个例子。
    • 我认为Order 应该引用CustomerId,而不是相反,如果没有特殊的不变量必须强制执行,例如最大数量的活动订单......即使这样。 ..
    猜你喜欢
    • 2016-03-21
    • 2015-01-04
    • 2012-02-19
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多