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