来自 DDD:解决软件核心的复杂性(第 177 页):
添加处理事件时需要更新交付历史记录会导致交易中涉及的 Cargo AGGREGATE。
a)在页面下方作者确实提出了一个替代解决方案,但仍然 - 上述摘录中的作者不是在本质上建议我们通过每次访问该属性时让属性查询数据库(通过存储库)来实现关联吗?DeliveryHistory.Events
b)由于作者“提出”的实现几乎与延迟加载的实现方式相同(除了延迟加载仅在我们第一次需要数据时查询数据然后缓存它),我还会问以下问题:
许多人通常反对延迟加载,但无论如何,我认为如果相关实体驻留在同一个聚合中,我们不应该使用延迟加载,因为这样的关联是用对象引用表示的,当我们需要事务完整性时实现?
原因是如果从不访问相关数据(因此从不检索),这种完整性可能会受到损害,因为在修改聚合时不能正确执行不变量?
更新:
一种)
当存储库加载 DeliveryHistory 实体时,可以加载 DeliveryHistory.Events 集合。它也可以通过延迟加载来加载,在这种情况下,ORM 会注入一个集合代理,该集合代理在迭代时会调用数据库。
但是作者不是提出了第三种选择,即每次访问(或者每次调用)都查询事件吗?DeliveryHistory.Events
DeliveryHistory.GetEvents()
b)
它类似于延迟加载,但重要的区别在于,借助存储库查询可以省略对象模型中的 Events 属性。这减少了 DeliveryHistory 实体的“足迹”。
我-我假设通过“类似于延迟加载”,您指的是每次请求事件时都从数据库中检索事件的设计?!
II - 无论如何,如果我们省略该DeliveryHistory.Events
属性(并且可能没有定义为替代 a DeliveryHistory.GetEvents()
),那么我们如何实现作者提出的设计(如我原来的帖子中所述,我知道在页面作者的下方是否提出了更好的选择)?
谢谢