首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDD:聚合和子聚合

DDD:聚合和子聚合
EN

Stack Overflow用户
提问于 2013-07-18 17:49:16
回答 1查看 1.9K关注 0票数 3

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

对于这个复杂的聚合(通过root的id加载整个聚合)有一个存储库,并且有一个用于管理可能的运输方法的CRUD存储库和另一个用于列出发票的存储库,这样做对吗?

更广泛地说,在DDD中是否可以有一个聚合,它是另一个聚合的一部分?

EN

回答 1

Stack Overflow用户

发布于 2013-07-18 18:41:29

你可以把“一个聚合,它是另一个聚合的一部分”看作是“一个聚合持有另一个聚合的引用”。

例如

代码语言:javascript
复制
public class Order {
    private Invoice invoice;
}

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

如果订单和发票在此上下文中都是聚合,那么我将拥有一个OrderRepository和一个InvoiceRepository.You,它可以使用

代码语言:javascript
复制
orderRepository.findBy(orderId)

您可以使用以下命令检索发票:

代码语言:javascript
复制
invoiceRepository.findBy(invoiceId) 

代码语言:javascript
复制
Order order = orderRepository.findBy(orderId);
Invoice invoice = order.getInvoice();

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

代码语言:javascript
复制
public Class Order {
    private InvoiceId invoiceId;
}

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

可以使用以下命令检索订单

代码语言:javascript
复制
orderRepository.findBy(orderId)

您可以使用以下命令检索发票:

代码语言:javascript
复制
invoiceRepository.findBy(invoiceId) 

代码语言:javascript
复制
Order order = orderRepository.findBy(orderId);
Invoice invoice = invoiceRepository.findBy(order.getInvoiceId()); 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17720040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档