我目前正在研究Eric Evans的“领域驱动设计”。骨料的概念对我来说很清楚,我觉得这很有趣。现在,我想到了一个类似汇总的示例:

BankAccount(1)---->(*)交易。

BankAccount
BigDecimal calculateTurnover();

BankAccount是一个汇总。为了计算营业额,我应该遍历所有交易并总结所有金额。 Evans假定我应该使用存储库来仅加载集合。在上述情况下,可能会有一些我不希望一次加载到内存中的事务。



您对在DDD聚合中实现calulcateTurnover的建议是什么?

最佳答案

正如您所指出的,在聚合中加载数千个实体不是可伸缩的解决方案。正如Vaughn Vernon在Effective Aggregate Design系列文章中所强调的那样,不仅会遇到性能问题,而且还可能会遇到并发问题。

您是否希望每笔交易都可以在BankAccount集合中使用,还是只关心营业额?

如果仅需要营业额,则在实例化BankAccount聚合时应建立此值。这很可能可以通过您的数据存储技术(例如,如果使用SQL的话,使用索引的JOIN进行有效计算)来计算。也许您还需要考虑将此作为数据存储中的预先计算的值(当您开始处理每个银行帐户的数百万笔交易时会发生什么)?

但是也许您仍然需要您域中可用的交易?然后,您应该考虑拥有一个单独的Transaction存储库。

我强烈建议您阅读上文链接的沃恩·弗农(Vaughn Vernon)关于聚合设计的系列。

10-08 08:32