Domain driven design 埃文';s采购订单示例:不应';零件是否在单个交易中与采购订单同步?

Domain driven design 埃文';s采购订单示例:不应';零件是否在单个交易中与采购订单同步?,domain-driven-design,Domain Driven Design,在第134页()上,作者改进了采购订单模型,将采购订单设为包含采购订单行项目的聚合根,而部分实体设为其自身聚合根(将Part设置为聚合根确实有意义,因为许多POs将共享这些部分): 符合此模型的实现将保证 与采购订单及其项目相关的不变量,同时更改采购订单的价格 零件不必立即影响引用它的项目 但这不是一个必须在任何时候都强制执行的不变量 使行项目对零件的依赖性更松散,我们可以避免 更好地反映业务的实际情况 同时,加强采购订单及其行项目之间的关系 保证遵守重要的业务规则 作者认为,零件价格的变化不

在第134页()上,作者改进了采购订单模型,将
采购订单
设为包含
采购订单行项目
的聚合根,而
部分
实体设为其自身聚合根(将
Part
设置为聚合根确实有意义,因为许多POs将共享这些部分):

符合此模型的实现将保证 与采购订单及其项目相关的不变量,同时更改采购订单的价格 零件不必立即影响引用它的项目

但这不是一个必须在任何时候都强制执行的不变量 使行项目对零件的依赖性更松散,我们可以避免 更好地反映业务的实际情况 同时,加强采购订单及其行项目之间的关系 保证遵守重要的业务规则

作者认为,零件价格的变化不必立即传播到参考它的PO总量,因为:

  • 在更新特定的PO时锁定部件可能会导致争用(因为可能有多个PO同时试图锁定同一部件)

  • 零件修改的频率低于POs,因此POs具有无效数据的可能性相对较小

a) 我理解作者的观点,但在这样的模型中,PO的一致性不应该是最优先的吗?因此,这些部分应该与正在更新的POs锁定在一起,即使存在争用的风险

b) 相比之下,在第176、177页上,作者确实发现有必要在单个事务中强制执行跨越两个聚合的不变量(即当添加
处理事件
时,
交付历史
也应在同一事务中相应地更新):

传递历史记录保存与以下内容相关的处理事件的集合: 它的货物和新物品必须作为 交易。如果未创建此反向指针,则对象 这将是不一致的

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

我不明白为什么在本例中维护单个事务的一致性比在PO示例中更重要

注意(我假设通过“反向指针”,他指的是
处理事件
实例?)

c) 作为替代方案,作者没有提出乐观一致性检查(Optimistic concurrency check)的实现,其中Parts表将包含一个rowversion字段,我们的代码将在每次更新某个PO时检查该字段,这有什么特别的原因吗

d) 顺便问一下,为什么必须将
价格
值复制到
行项目
(图6.11,第134页)?采购订单的不变量不能通过检查
零件
实体来检查价格吗


谢谢

采购订单一旦下达,就可以被视为一个不可更改的事件。这就是为什么必须复制价格值。未来的价格变化不应反映在现有的POs上——这将违反业务规则。这就是为什么采购订单和零件之间的关系可以而且应该放松的原因。这也是为什么这些一致性特征适用于采购订单,但不适用于其他场景

如果将PO(一旦放置)视为不可变是一项业务规则,那么我假设这也意味着PO(即PO聚合中的对象)在放置此PO后也不应编辑?是的。然而,这可能取决于采购订单的性质。有时可以放置PO,但可以更新状态。在这种情况下,PO项目保持不变,但添加了新的状态。可以肯定的是,作者是否使用术语“反向指针”来指代处理事件实例?是的,他指的是处理事件和历史之间的指针,就像在对象引用中一样。这不同于身份证明。你可能是对的,这次回答时我没有看这本书。指针意味着对象引用,我只是不确定引用了哪些实体。