Domain driven design 复杂的聚集体-哪些是根?

Domain driven design 复杂的聚集体-哪些是根?,domain-driven-design,aggregateroot,Domain Driven Design,Aggregateroot,构建复杂的制造管理系统。我有几十个实体,其中一些似乎有意义,而另一些显然没有 请允许我按重要性顺序列出各种实体: 工单 引述 发票 保证书 认证 不合格 船运 串行日志 赛洛格 序列 返工 消耗品 RepairLineItem 这些只是一些问题,但与我的问题最相关 所有这些(发票除外)仅与工作订单(TrackingID)相关 工单可以不存在任何不符合项、保修等,唯一的例外是顺序-工单必须至少有一个顺序 返工将聚合它自己的序列集合,在事实发生后创建的序列必须属于返工 工作订单可能没有报价单,但报价

构建复杂的制造管理系统。我有几十个实体,其中一些似乎有意义,而另一些显然没有

请允许我按重要性顺序列出各种实体:

  • 工单
  • 引述
  • 发票
  • 保证书
  • 认证
  • 不合格
  • 船运
  • 串行日志
  • 赛洛格
  • 序列
  • 返工
  • 消耗品
  • RepairLineItem
  • 这些只是一些问题,但与我的问题最相关

    所有这些(发票除外)仅与工作订单(TrackingID)相关

    工单可以不存在任何不符合项、保修等,唯一的例外是顺序-工单必须至少有一个顺序

    返工将聚合它自己的序列集合,在事实发生后创建的序列必须属于返工

    工作订单可能没有报价单,但报价单至少需要访问消耗品和维修线项目(用于统计工作范围的总数)

    最初,我将所有这些实体建模为Workorder/AR的集合,但这是一个糟糕的设计,因此我开始使用自己的存储库创建它们自己的集合根。但是,通过这样做,我现在已经失去了强制执行约束的能力

    例如,创建工单时,它有固定数量的序列,由批准的手册指定。检查员可以打开或关闭这些序列。然后打印该工单旅行者,并锁定工单以防止更改。有时需要添加新序列,以纠正错误或因为原始手册缺少关键步骤-这是在创建返工并将新序列添加到工单时

    添加这些序列时,需要通知workorder聚合根,以便分析更改,并可能重新安排估计的完成时间

    同样,工单也有一套修理项目或消耗品清单(后者可在检查后随时添加)。如果这些实体中任何一个的数量发生变化,则必须渗透回工单,工单必须通知报价汇总,以便更新总成本,并通过电子邮件通知相关方

    显然,使用单片AR是没有意义的(特别是从性能角度来看——这是作为基于AJAX的web应用程序实现的)。工单的存储库将与以下方法交织在一起:

    selectAllConsumablesForWorkOrder()
    selectAllRepairItemsForWorkOrder()
    selectAllCertificationsForWorkOrder()
    

    我的问题是,考虑到上述场景和需求,我如何在执行这些不变规则的同时使用较小的聚合根?如果所有内容都由WorkOrder/AR封装,我可以看到如何轻松实施上述要求

    我对DDD的理解还远远不够完美,所以请温柔一点:)

    可能我对AR的所有内容都有错误的印象,但我读过的大多数文章似乎都建议使用产品和多行项目示例。这实际上就是这个工作单,但每个行项目可能被其他集合共享

    任何经验或意见都值得赞赏

    问候,,
    Alex

    一些ddd标记的问题很难回答,因为它们是特定于领域的。老实说,我不完全理解WorkOr序域,但是一般来说,如果你想使用更小的集合,你可以考虑DeMeNevices。

    您可以发布一个DomainEvent,它表示在有界上下文中实际发生的某些事情,如

    创建返工(聚合)时,发布一个返工CreateDevent,其中包含跟踪ID序列(可以是值对象)。ReworkCreateDevenHandler负责更新相应的工作订单(聚合),然后发布一份工作订单完成时间重新估计文件,通知以下步骤

    根据不变量,可以同步或异步处理事件。您需要与您的领域专家讨论这些问题

    我认为使用较小的聚合是一个昂贵的决定,您需要优秀的领域专家和一些优秀的基础设施