Domain driven design 当相关实体位于同一聚合中时使用延迟加载

Domain driven design 当相关实体位于同一聚合中时使用延迟加载,domain-driven-design,Domain Driven Design,摘自(第177页): 添加处理事件时需要更新传递历史记录 交易中涉及的货物总量 a) 进一步往下看,作者确实提出了一个替代解决方案,但上面摘录中的作者不是实质上建议我们通过DeliveryHistory.Eventsproperty每次访问此属性时都查询数据库(通过存储库)来实现关联吗 b) 由于作者“建议”的实现方式与延迟加载的实现方式几乎相同(延迟加载只是在我们第一次需要数据时查询数据,然后缓存数据),因此我还将询问以下问题: 一般来说,许多人反对延迟加载,但不管怎样,我认为如果相关实体位于

摘自(第177页):

添加处理事件时需要更新传递历史记录 交易中涉及的货物总量

a) 进一步往下看,作者确实提出了一个替代解决方案,但上面摘录中的作者不是实质上建议我们通过
DeliveryHistory.Events
property每次访问此属性时都查询数据库(通过存储库)来实现关联吗

b) 由于作者“建议”的实现方式与延迟加载的实现方式几乎相同(延迟加载只是在我们第一次需要数据时查询数据,然后缓存数据),因此我还将询问以下问题:

一般来说,许多人反对延迟加载,但不管怎样,我认为如果相关实体位于同一聚合中,我们永远不应该使用延迟加载,因为这样的关联是用对象引用表示的,而对象引用是在我们需要事务完整性时实现的

原因是,如果相关数据从未被访问(因此也从未被检索),那么这种完整性可能会受到损害,因为在修改聚合时,不变量无法正确执行

更新:

(a)

当 DeliveryHistory实体由存储库加载。也可以是 通过延迟加载加载,在这种情况下ORM注入一个集合 在迭代时调用数据库的代理

但作者不是提出了第三个选项吗,即每次访问
DeliveryHistory.events
(或者每次调用
DeliveryHistory.GetEvents()
)时查询事件

(b)

它类似于延迟加载,但重要的区别在于 使用存储库查询可以省略事件 对象模型中的属性。这减少了系统的“足迹” DeliveryHistory实体

我-我假设通过“类似于延迟加载”,您指的是每次请求事件时都从db检索事件的设计

II-无论如何,如果我们省略了
DeliveryHistory.Events
属性(并且可能没有将
DeliveryHistory.GetEvents()
定义为一个备选方案),那么我们如何实现作者提出的设计(正如我在最初的帖子中所指出的,我知道在页面下方作者确实提出了一个更好的备选方案)

谢谢

a)存储库加载DeliveryHistory实体时,可以加载
DeliveryHistory.Events
集合。它也可以通过延迟加载来加载,在这种情况下,ORM会注入一个集合代理,该代理在迭代时调用数据库

b) 它类似于延迟加载,但重要的区别在于,诉诸存储库查询允许在对象模型中省略Events属性。这减少了
DeliveryHistory
实体的“足迹”


延迟加载的问题不是数据可能永远不会被访问,而是第一次访问延迟加载的属性将导致数据库调用,并且您必须确保连接仍然处于活动状态。从某种意义上说,这可能会损害应被视为一个整体的骨料的完整性

更新

a) 无论哪种方式,最终结果都是一样的。我不确定在写这本书(2003年)时是否使用了创建代理集合的技术

b1)是的,它们的相似之处在于事件不会与DeliveryHistory实体一起加载,而只是按需加载


b2)将通过调用存储库来访问事件,而不是DeliveryHistory实体上的事件属性。存储库本身将由周围的应用程序服务调用。它将检索事件并将它们传递到需要它们的地方。或者,如果用例正在添加事件,应用程序服务将调用存储库来持久化事件。

“延迟加载的问题……您必须确保连接仍然处于活动状态。从某种意义上说,这可能会损害聚合的完整性,而聚合应被视为一个整体。”出于同样的原因,我们也不应该实现这样的设计:每次访问DeliveryHistory.Events时,都会执行DB查询?换句话说,与DB的连接可能会中断,因此聚合的完整性可能会受到损害(因为从概念上讲,聚合不能被视为一个整体)?延迟加载是这样一种设计,即一旦访问事件,就会调用DB(即使只调用一次)。是的,DB连接可能会断开,因为在加载集合时,实体可能处于与最初从repo加载时不同的上下文中。“延迟加载是这样一种设计,即一旦访问事件,就会调用DB(即使只调用一次).2如果我理解正确,从概念上讲,该设计仍然被视为延迟加载,即使DeliveryHistory.Events属性每次访问时都检索相关事件?我不确定这是否符合传统意义上的延迟加载。延迟加载可能更合适。延迟通常与h第一次之后缓存的延迟加载。