我有一个非常复杂的聚合,带有聚合 root Order
。OrderItem
它包含在聚合之外没有意义的实体(例如)。但是也有一些实体应该是这个聚合的一部分,但在这个聚合之外也有意义(例如ShippingMethod
或Invoice
)。
为这个复杂的聚合拥有一个存储库(通过 root 的 id 加载整个聚合)并且还有一个用于管理可能的运输方式的 CRUD 存储库和另一个用于列出发票的存储库是否正确?
更一般地说,在 DDD 中是否可能有一个聚合,它是另一个聚合的一部分?
我有一个非常复杂的聚合,带有聚合 root Order
。OrderItem
它包含在聚合之外没有意义的实体(例如)。但是也有一些实体应该是这个聚合的一部分,但在这个聚合之外也有意义(例如ShippingMethod
或Invoice
)。
为这个复杂的聚合拥有一个存储库(通过 root 的 id 加载整个聚合)并且还有一个用于管理可能的运输方式的 CRUD 存储库和另一个用于列出发票的存储库是否正确?
更一般地说,在 DDD 中是否可能有一个聚合,它是另一个聚合的一部分?
您可以将“一个聚合,它是另一个聚合的一部分”视为“一个聚合包含另一个聚合的引用”。
例如
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());