Doctrine orm 聚合根设计

Doctrine orm 聚合根设计,doctrine-orm,domain-driven-design,aggregateroot,Doctrine Orm,Domain Driven Design,Aggregateroot,试图对“制造工厂”软件系统建模 整个系统的核心是“workorder”——几乎每个实体(其中许多实体未在此显示或部分AR未显示)都以某种方式连接到它。但它看起来主要是: + WorkOrder_Root + TrackingID: Property (UID) + DateReceived: Property + DateApproved: Property + PartName: Property + PartNumber: Property + Rew

试图对“制造工厂”软件系统建模

整个系统的核心是“workorder”——几乎每个实体(其中许多实体未在此显示或部分AR未显示)都以某种方式连接到它。但它看起来主要是:

 + WorkOrder_Root
   + TrackingID: Property (UID)
   + DateReceived: Property
   + DateApproved: Property
   + PartName: Property
   + PartNumber: Property

   + Rework: Collection (1:m)

   + SerialLog: Collection (1:m)
   + CeriLog: Collection (1:m)

   + Sequences: Collection (1:m)
   + Dimensions: Collection (1:m)
   + Consumables: Collection (1:m)

   + Quoting: Single 
   + Invoice: Single 
   + Warranty: Single 
   + Certification: Single 
这是一个巨大的AR(不完整——有更多的属性/集合。在过去的几天里,我读了更多的文章和迷你书,我很想知道我是否应该尝试分解成更多的AR

以上所有集合都是实体的集合,但在工单上下文之外没有一个是有意义的

没有工单就不能开具发票,没有工单就不能报价,一切都依赖于工单

我主要关心的是我所理解的潜在并发问题。例如,如果有人正在处理W/O:66354更改报价,而其他人正在添加返工,则存在某种竞争条件

返工可以改变价格,因此在返工完成之前报价让我想到,也许返工应该是它自己的AR——但所有返工都属于一个工单,如果不先打开/加载工单,就无法构建返工

我在模型中的所有其他AR都相对简单,最多3个子实体和少量属性,但工作顺序是一个野兽,我想知道拥有这个“上帝”对象会出现什么类型的问题

编辑:我刚刚通读了以下内容 () 不变量让我三思。如果序列可以更新或 在无需通知其所在工单的情况下进行了更改 关联,则序列是AR的候选序列???序列可能是 一个糟糕的例子是,对序列的更改确实需要反映在 工作顺序是根…但还是…我走对了吗?让我 业务规则(而不是以逻辑或数据为中心的组织) 指引道路

问候,,
Alex

聚合当然不应该像您指出的那样大。聚合中包含的对象应该具有高度耦合性,并且共享一些必须始终满足的不变量。聚合之间的不变量最终才是一致的。您不能始终依赖于它们的有效性。我可以想象,您可以安全地保护aga用两步流程消除这些不一致。首先检查先决条件。进行更改。再次检查是否一切正常。如果没有,请撤消更改并重新开始。如果您有可能触发其他事件的更改,请使用域事件。通过它们,您可以松散地耦合一些流程。

刚刚发现本文:u无法验证的是实体的不变量。不变量是实体成为实体的本质。我们可能会问我们的客户,一个人(在我们的系统中)可以是没有出生日期的人吗?在这种情况下,几乎所有实体(保修、认证、发票、报价等)不是不变量,应该有自己的AR吗?一个工作单可以没有报价而存在(它是不完整的,但确实发生了)。补充到上面的注意事项,一个工作单没有报价就不能开票——那么如何将其建模为AR呢?你不能创建一个没有工作单的报价——我的头现在在打转:)最后……如果Quoting不是WorkOrder的子实体——我们如何确保有效的WorkOrder与之关联?这是在Quoting save方法的验证中完成的吗???如果您现在保护的不变量可以用最终一致性替换(请咨询您的领域专家),那么聚合可以是decomposite.@Alex.Barylski关于您如何实现这一点的任何更新?想知道你的方法…哦。刚刚意识到这个问题有多古老。:-)