DDD(Domain-Driven-Design) - 大型聚合

Mar*_*nik 7 domain-driven-design aggregate

我目前正在研究Eric Evans'es Domain-Driven-Design.聚合的想法对我来说很清楚,我发现它非常有趣.现在我想到一个像聚合的例子:

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

BankAccount
BigDecimal calculateTurnover();
Run Code Online (Sandbox Code Playgroud)

BankAccount是一个聚合.为了计算营业额,我应该遍历所有交易并总结所有金额.埃文斯假设我应该使用存储库来加载aggreagates.在上面的例子中,可能有几万个事务,我不希望在内存中同时加载.

在存储库模式的上下文中,聚合根是唯一的对象>您的客户端代码从存储库加载.

存储库封装了对子对象的访问 - 从调用者的角度来看,它会自动加载它们,无论是在加载根目录还是实际需要它们时(如延迟加载).

你有什么建议在DDD聚合中实现calulcateTurnover?

Dav*_*New 6

正如您所指出的,加载数千个实体并不是一个可扩展的解决方案。正如 Vaughn Vernon 在他的有效聚合设计系列中所强调的那样,您不仅会遇到性能问题,而且还可能遇到并发问题。

您是否希望每笔交易都可以汇总BankAccount,还是只关心营业额?

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

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

我强烈建议阅读 Vaughn Vernon 的聚合设计系列,如上面的链接。