假设订单有一个典型的模型:
订单(aggregateRoot) { OrderLine } OrderLine (entityInsideOrderAR) {产品;数量}产品(AggregateRoot){名称}
对于会计目的来说,这是一个合适的设计吗?我的意思是,calculateTotalProductSales()应该驻留在哪里?引用应该是非循环的,所以如果产品应该有一个OrderCollection,这将不是一个好的设计。即使对于产品的特殊聚合子对象,ProductHistory也应该引用Order,并且再次多次加载一个对象(循环引用)。
对于这种情况,什么是一个好的设计?基本上我需要做一些基于产品销售额的计算(countTotalSalesForProduct(),calculateTotalSalesForProduct()等)。一些简单的会计计算)。
附言:将OrderLine提升一级并使其成为AR是一个好的想法吗?
发布于 2014-02-20 09:10:54
人们可以将会计功能拆分成一个高级的有界上下文。可以在不破坏现有排序上下文的情况下开发一组独占模型。此外,现实中有很多订单信息对于会计领域来说是不必要的(如发货地址、备注等)。报告和统计也是会计领域的常见需求,这使得一刀切的领域模型解决方案变得更糟糕。它们可能被实现为难以测试和维护的复杂SQL,或者导致域逻辑泄漏到基础架构层。
使用域事件来集成两个有界上下文可能是一个好主意。您可以参考Accounting Pattern,其中Martin Fowler建议使用事件来触发记帐流程。
发布于 2014-02-20 16:21:24
为此,您可能应该研究一下CQRS模式。您以两种方式使用域对象。除非您从数据库中获取所有订单并在某个循环中遍历它们,否则您无法获得所有的Product sales。这将是,嗯,很慢。这就是为什么报告通常是在另一个有界的上下文中完成的,正如Hippoom建议的那样。读一读吧。
https://stackoverflow.com/questions/21895909
复制相似问题