DDD:聚合和子聚合

时间:2013-07-18 09:49:16

标签: language-agnostic doctrine-orm domain-driven-design aggregateroot

我有一个非常复杂的聚合,聚合根Order。它包含在聚合之外无意义的实体(例如OrderItem)。但也有一些实体应该是这个聚合的一部分,但在这个聚合之外也是有意义的(例如。ShippingMethodInvoice)。

是否拥有此复杂聚合的存储库(按root的id加载整个聚合),还有用于管理可能的送货方式的CRUD存储库和用于列出发票的另一个存储库?

更一般地说,DDD中是否有可能有一个聚合,这是另一个聚合的一部分?

1 个答案:

答案 0 :(得分:2)

您可以将“聚合,这是另一个聚合的一部分”视为“聚合包含另一个聚合的引用”。

例如

public class Order {
    private Invoice invoice;
}

<class name="Order" table="T_ORDER">
    <one-to-one name="invoice" column="INVOICE_ID" />
</class>

如果Order和Invoice都是此上下文中的聚合,我将拥有OrderRepository和InvoiceRepository。您可以使用

检索订单
orderRepository.findBy(orderId)

您可以使用

检索发票
invoiceRepository.findBy(invoiceId) 

Order order = orderRepository.findBy(orderId);
Invoice invoice = order.getInvoice();

有一篇关于如何设计聚合(http://dddcommunity.org/library/vernon_2011/)的着名文章,建议使用身份参考来实现这种关系。

public Class Order {
    private InvoiceId invoiceId;
}

<class name="Order" table="T_ORDER">
    <component name="invoiceId">
        <property name="value" column="INVOICE_ID" />
    </component>
</class>

您可以使用

检索订单
orderRepository.findBy(orderId)

您可以使用

检索发票
invoiceRepository.findBy(invoiceId) 

Order order = orderRepository.findBy(orderId);
Invoice invoice = invoiceRepository.findBy(order.getInvoiceId());