了解域驱动设计(DDD)中的聚集体和汇总根的问题



我偶然发现了一个问题:"我无法将域模型分为聚合根"。

我是DDD的初级开发人员和新手。我真的很想理解它,但有时确实令人困惑。

从这一点开始,我想简要描述我的域。

我的索款专门为用户提供机会创建任何类型的文档。用户可以创建新的文档类型。每种新类型都包含其属性。然后,此应用程序的用户可以根据其类型创建混凝土文档。用户还可以发送文档以供批准。每种类型的批准流都不同。

所以,我们有以下模型:

  1. documentType/documentTemplate-充当基于哪个模板创建了具体文档。它与许多关系文档。
  2. documentsAttribute-表示文档的属性。它与DocumentType有很多关系。
  3. attributeValue-创建具体文档时,它会查看它的类型并为属性创建值它的类型。许多与文档和属性的关系。
  4. 文档 - 表示用户创建的具体文档。

还有其他模型,但我认为它们没有意义。

您了解,在这里我应用了数据模型的实体属性值(EAV)模式。您可以看到一个显示数据库中关系的图。

我的问题是:

我在模型中还有很多实体,除了我所描述的。

我认为该文档绝对是我域中的总体根源。因为总体批准程序等事情不能依靠它。

这是第一个问题:

批准程序包括其步骤。每个步骤都是一个实体,因为它是可变的。一个步骤具有可以更改的状态。ApplaProcess的状态取决于其步骤。在这里,我们有一个业务不变:"只有在批准其所有步骤的情况下才能批准批准"。

我认为这是一个总体根源,因为它具有业务不变,并且包含无法生存的实体。而且我们不想直接访问其步骤,以保持批准程序一致。

我是否误以为批准程序是一个骨料?可能只是一个聚集吗?一个骨料根可以在另一个部分中存在吗?这是否意味着批准程序只是汇总的,因为文件负责访问其零件?但是,当批准批准的步骤时,文档将委托批准程序的操作。

例如:

Document doc = new Document(...);
doc.SendForAooroval(); //ApprovalProcess is created.
doc.ApproveStep(int stepId); // Inside the method Document delegates responsibility for approvement to ApprovalProcess.

,或者我应该分别留下文件并批准。因此,文件将以身份参考批准程序。我们有以下方案:

Document doc = documentRepository.Get(docId);
doc.SendForAooroval();// A domain event "DocumentCreatedEvent" is raised.

document createdeventhandler:

ApprovalProcess approvalProcess = new ApprovalProcess(event.DocId); // ApprovalProcessCreatedEvent is raised
approvalProcessRepository.Add(approvalProcess);
approvalProcessRepositroy.UnitOfWork.Save(); //commit 

但是,如果批准程序的状态发生了变化,则文件的状态也会改变。批准批准,然后也批准了文件。另一个词批准程序是文件状态的一部分。只有多亏了这一点,我们才能知道该文件已被批准。

和我遇到的最大问题:

documentType也是一个聚合根。它包括其属性和批准。我尚未提及批准的目的,目的是使我的解释尽可能简单。Apporvalscheme也来自某些实体。这只是DocumentType的批准流。根据具有文档的DocumentType的批准,批准程序是创建的。没有DocumentType,批准Cheme就不可能存在。一对一的关系。

文档通过身份引用其DocumentType。它正确吗?

在此任务的开始时,我认为DocumentType应该是文档的一部分。

documentType有很多文档,但是在我的域中,这是没有意义的。它不代表documentType的状态。DocumentType可以被标记为已删除,但不能删除。

文档和DocumentType是两个不同的聚合根。我是对的吗?

如果您阅读了它,非常感谢。非常感谢您的关注和帮助!对不起,我的英语可怕。

我是否误以为批准程序是一个骨料?可能是 只是一个聚合?一个骨料根可以在另一个存在吗? 这是一部分?

这些问题对我来说没有任何意义。聚合是一组实体和价值对象,其中一个实体是组的父。骨料根是聚合的母体实体。一个特定的情况是当汇总只是一个实体时。单独的实体是一个聚合,实体当然是总体根源。

我认为我会尝试从另一个角度来对您的问题进行建模:作为状态机。

我将批准程序视为文档所遵循的流程,而不是作为实体。我不知道该过程的流程图,但是我想您所说的"步骤"将是文档在此过程中可以具有的"状态",并且您在步骤之间进行过渡,因此首先,当您创建一个时,新文档,它是一个开始步骤,并且在文档的一生中,它从一个步骤传递到另一个步骤,直到达到最后一步(例如,批准文档)。

因此,文档实体将具有改变其状态的行为。

例如,在Java中,您可以用枚举实现状态模式(状态计算机)。

最新更新