我目前正在研究Eric Evans的“领域驱动设计”。骨料的概念对我来说很清楚,我觉得这很有趣。现在,我想到了一个类似汇总的示例:
BankAccount(1)---->(*)交易。
BankAccount
BigDecimal calculateTurnover();
BankAccount是一个汇总。为了计算营业额,我应该遍历所有交易并总结所有金额。 Evans假定我应该使用存储库来仅加载集合。在上述情况下,可能会有一些我不希望一次加载到内存中的事务。
您对在DDD聚合中实现calulcateTurnover的建议是什么?
最佳答案
正如您所指出的,在聚合中加载数千个实体不是可伸缩的解决方案。正如Vaughn Vernon在Effective Aggregate Design系列文章中所强调的那样,不仅会遇到性能问题,而且还可能会遇到并发问题。
您是否希望每笔交易都可以在BankAccount
集合中使用,还是只关心营业额?
如果仅需要营业额,则在实例化BankAccount
聚合时应建立此值。这很可能可以通过您的数据存储技术(例如,如果使用SQL的话,使用索引的JOIN进行有效计算)来计算。也许您还需要考虑将此作为数据存储中的预先计算的值(当您开始处理每个银行帐户的数百万笔交易时会发生什么)?
但是也许您仍然需要您域中可用的交易?然后,您应该考虑拥有一个单独的Transaction
存储库。
我强烈建议您阅读上文链接的沃恩·弗农(Vaughn Vernon)关于聚合设计的系列。