3

集約ルートを持つ非常に複雑な集約がありOrderます。OrderItem集約の外では意味のないエンティティ (例: ) が含まれています。ただし、この集合体の一部であると想定されているが、この集合体の外でも意味を持つエンティティもあります (例:ShippingMethodInvoice)。

この複雑な集計 (ルートの ID によって集計全体をロードする) のリポジトリを用意し、考えられる配送方法を管理するための CRUD リポジトリと、請求書を一覧表示するための別のリポジトリを用意するのは正しいことですか?

より一般的には、DDD で別の集計の一部である集計を使用することは可能ですか?

4

1 に答える 1

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 があります。次を使用して Order を取得できます。

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()); 
于 2013-07-18T10:41:28.563 に答える