Language agnostic DDD:骨料和子骨料

Language agnostic DDD:骨料和子骨料,language-agnostic,doctrine-orm,domain-driven-design,aggregateroot,Language Agnostic,Doctrine Orm,Domain Driven Design,Aggregateroot,我有一个非常复杂的聚合,聚合根Order。它包含在聚合之外没有意义的实体(例如,OrderItem)。但也有一些实体被认为是该聚合的一部分,但在该聚合之外也有意义(例如ShippingMethod或Invoice) 是否有一个用于此复杂聚合的存储库(按root的id加载整个聚合)以及一个用于管理可能的装运方法的CRUD存储库和另一个用于列出发票的存储库 更一般地说,DDD是否有可能是一个集合,它是另一个集合的一部分? < P>你可以考虑“一个集合,它是另一个集合的一部分”,作为“一个集合持有另一

我有一个非常复杂的聚合,聚合根
Order
。它包含在聚合之外没有意义的实体(例如,
OrderItem
)。但也有一些实体被认为是该聚合的一部分,但在该聚合之外也有意义(例如
ShippingMethod
Invoice

是否有一个用于此复杂聚合的存储库(按root的id加载整个聚合)以及一个用于管理可能的装运方法的CRUD存储库和另一个用于列出发票的存储库

更一般地说,DDD是否有可能是一个集合,它是另一个集合的一部分?

< P>你可以考虑“一个集合,它是另一个集合的一部分”,作为“一个集合持有另一个集合的参考”。 比如说

public class Order {
    private Invoice invoice;
}

<class name="Order" table="T_ORDER">
    <one-to-one name="invoice" column="INVOICE_ID" />
</class>
您可以使用

invoiceRepository.findBy(invoiceId) 
invoiceRepository.findBy(invoiceId) 

还有一篇关于如何设计aggregates()的著名文章建议使用标识引用实现这种关系

public Class Order {
    private InvoiceId invoiceId;
}

<class name="Order" table="T_ORDER">
    <component name="invoiceId">
        <property name="value" column="INVOICE_ID" />
    </component>
</class>
您可以使用

invoiceRepository.findBy(invoiceId) 
invoiceRepository.findBy(invoiceId) 


这是否有帮助:使用一个表示
ShippingMethod
数据的值对象看起来是个好主意,谢谢。如何使用ORM实现这一点(我使用的是php和doctrine)?实体中的引用id不被认为是反模式吗?我不熟悉php和条令。但它可以使用Java中Hibernate的常规一对一映射来实现(在聚合引用聚合情况下)。我不确定引用id是否是一种反模式,是否有一些文章或参考资料对此进行了讨论?该理论主要受Hibernate的启发。我的意思是,在一个实体中有一个像invoiceId这样的整数属性是一种反模式。编辑:现在我知道你指的不是一个整数,而是一个只包含id的值对象。引用id是一个值对象。您现在将发出两个查询,而不是通过
Order
导航到
Orderitems
。但是我希望将数据库中的Order.invoice\u id作为外键,因为这样更容易报告。是否有方法将其映射到域模型中的VO和报告模型中的相关实体?或者我应该将域实体和持久性实体分开(它们几乎相同)?
invoiceRepository.findBy(invoiceId) 
Order order = orderRepository.findBy(orderId);
Invoice invoice = invoiceRepository.findBy(order.getInvoiceId());