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());