Domain driven design 包含大量数据的域对象

Domain driven design 包含大量数据的域对象,domain-driven-design,aggregate,Domain Driven Design,Aggregate,我们的域需要处理大量(可能超过1000条记录)的对象作为域概念。这主要是域业务逻辑需要使用的历史数据。通常,这种处理依赖于存储过程或其他服务来完成这种工作,但由于它都与域密切相关,并且我们希望保持模型的有效性,因此我们希望找到一种解决方案,允许聚合管理处理数据所需的所有业务逻辑和规则 本质上,我们讨论的是过去的事务数据。我们的想法是构建一个轻量级类,并从数据库中为我们需要处理的每个事务创建一个实例。我们对此感到不舒服,因为我们将实例化大量的对象,并且可能会影响性能,但我们同样不喜欢将此域逻辑卸载

我们的域需要处理大量(可能超过1000条记录)的对象作为域概念。这主要是域业务逻辑需要使用的历史数据。通常,这种处理依赖于存储过程或其他服务来完成这种工作,但由于它都与域密切相关,并且我们希望保持模型的有效性,因此我们希望找到一种解决方案,允许聚合管理处理数据所需的所有业务逻辑和规则

本质上,我们讨论的是过去的事务数据。我们的想法是构建一个轻量级类,并从数据库中为我们需要处理的每个事务创建一个实例。我们对此感到不舒服,因为我们将实例化大量的对象,并且可能会影响性能,但我们同样不喜欢将此域逻辑卸载到存储过程中,因为这会破坏我们模型的一致性

关于如何解决这个问题,有什么想法吗?

是缓解这个问题的一种技术,大多数流行的对象关系管理解决方案都实现了这一点。它有诽谤者(例如,见),但是其他人认为懒惰的装载是不可缺少的。 专业人士

  • 可以将聚合的内存占用减少到可管理的水平
  • 让您的ORM基础架构为您管理您的应用程序
  • 在不需要大量子数据的情况下,它可以比完全具体化聚合根更快
缺点

  • Chattier可以同时实现聚合。你会去数据库做很多小的旅行
  • 通常需要对域实体类进行架构更改,这可能会损害您自己的设计。(例如,NHibernate只要求您公开一个默认构造函数,使您的实体成为虚拟的,以利用延迟加载—但我见过其他更具侵入性的解决方案)
相比之下,另一种方法是创建多个类来表示每个实体。这些类本质上是针对特定用例定制的部分聚合。这样做的主要缺点是,您可能会增加域客户端需要处理的类的数量和逻辑的数量。

“1000”对于简单对象来说并不是一个很大的数字。我知道,在我工作的系统中,一个给定的线程在给定的时间内可能持有上万个域对象,而其他线程在同一时间也在这样做。当你考虑到在一个相当复杂的应用程序中发生的所有不同的事情时,1000个对象是一个水落石出。


YMMV取决于这些对象所持有的资源种类、系统负载、硬性能要求或任何其他因素,但如果如您所说,它们只是“轻量级”对象,我会确保您在尝试变得过于花哨之前确实存在性能问题。

当您说1000条记录值时,你是说1000张桌子还是1000行?将有多少数据加载到内存中?

这完全取决于对象的内存占用。如果所讨论的对象引用了流程中不感兴趣的其他对象,那么延迟加载确实会有所帮助

如果最终导致性能问题,您必须询问自己(或者您的客户)流程是否必须同步运行,或者是否可以将其卸载到其他地方的批处理流程中


如果我们知道需要同时使用所有这些记录进行搜索、排序、求和等,那么延迟加载仍然是一种选择吗?我认为延迟加载主要是针对在特定时间之前可能不需要加载的数据,并且希望分散工作的情况。不,你完全正确-在这些情况下,它没有用处。对于聚合操作,我认为重要的是做出务实的折衷,并将一些逻辑转移到域模型之外。回顾过去,我帖子中的关键词是“潜在的性能影响”。当我想到这一点时,我可能正在进行“过早优化”。也许我应该首先找出这是否真的是一个问题:)不过,我相信这个问题的用意是值得考虑的。虽然这一次很可能是过早的优化,但在某些情况下,需要大量数据的行为显然属于给定领域概念的责任范围。