我偶然发现了一个问题:“我不能把我的域模型分割成聚合根”。
我是DDD的初级开发人员和新手。我真的很想理解它,但有时它真的令人困惑。
从这一点出发,我想简单地描述一下我的领域。
我的宗旨是为用户提供机会,让他们自己创建任何类型的文档。用户可以创建新类型的文档。每种新类型都由其属性组成。然后,该应用程序的用户可以根据其类型创建一个具体的文档。用户还可以发送文档以供审批。每个类型的审批流是不同的。
因此,我们有以下模型:
有其他的模型,但我不认为他们有意义。
正如您所理解的,这里我应用了数据模型的实体属性值(EAV)模式。您可以看到一个图解,它显示数据库中的关系。
我的问题是:
我在我的模型中有很多实体,除了我所描述的。
我认为该文档绝对是我领域中的一个聚合根。因为像ApprovalProcess这样的东西是聚合的,不能靠它生存。
以下是第一个问题:
ApprovalProcess由它的步骤组成。每个步骤都是一个实体,因为它是可变的。步骤的状态可以更改。ApprvalProcess的状态取决于其步骤。这里我们有一个业务不变式:“只有当所有步骤都被批准时,ApprovalProcess才能被批准”。
我认为它是一个聚合根,因为它具有业务不变,并且包含无法使用它的实体。我们不想为了保持ApprovalProcess的一致性而允许直接访问它的步骤。
,我是不是搞错了,ApprovalProcess是一个聚合根?它是否只是一个集合呢?一个聚合根可以作为它的一部分存在于另一个集合根中吗?这是否意味着ApprovalProcess只是聚合,因为文档负责对其部件的访问?但是,当ApprovalProcess的步骤被批准时,文档将一个操作委托给ApprovalProcess.。
例如:
Document doc = new Document(...);
doc.SendForAooroval(); //ApprovalProcess is created.
doc.ApproveStep(int stepId); // Inside the method Document delegates responsibility for approvement to ApprovalProcess.或者我应该把文档和ApprovalProcess分开。因此,文档将通过标识引用ApprovalProcess。我们有以下情况:
Document doc = documentRepository.Get(docId);
doc.SendForAooroval();// A domain event "DocumentCreatedEvent" is raised.DocumentCreatedEventHandler:
ApprovalProcess approvalProcess = new ApprovalProcess(event.DocId); // ApprovalProcessCreatedEvent is raised
approvalProcessRepository.Add(approvalProcess);
approvalProcessRepositroy.UnitOfWork.Save(); //commit 但是,如果ApprovalProcess的状态发生变化,Document的状态也会发生变化。ApprovalProcess被批准,然后文档也被批准。另一个词ApprovalProcess是文档状态的一部分。只有这样,我们才能知道那份文件是被批准的。
我遇到的最大问题是:
DocumentType也是一个聚合根。它由属性和ApprovalScheme组成。为了使我的解释尽可能简单,我还没有有意提到ApprovalScheme。ApporvalScheme也由一些实体组成。这只是DocumentType的一个审批流程。ApprovalProcess是根据有文档的ApprovalScheme of DocumentType创建的。没有ApprovalScheme就不可能存在DocumentType。一对一的关系。
文档通过标识引用其DocumentType。对吗?
在开始这项任务时,我认为DocumentType应该是文档的一部分。
DocumentType有很多文档,但在我的领域,这是没有意义的。它并不代表DocumentType的状态。DocumentType可以标记为已删除,但不能删除。
文档和DocumentType是两个不同的聚合根。我说得对吗?
如果你看的话,非常感谢你。非常感谢您的关注和帮助!为我糟糕的英语感到抱歉。
发布于 2019-02-20 00:35:33
我是否误解了ApprovalProcess是一个聚合根?它是否只是一个集合呢?一个聚合根可以作为它的一部分存在于另一个集合根中吗?
这些问题对我没有任何意义。聚合是一组实体和值对象,其中一个实体是该组的父实体。聚合根是聚合的父实体。一个特殊的情况是,聚合只是一个实体。该实体本身就是一个聚合体,该实体当然是聚合根。
我想我会尝试从另一个角度来模拟你的问题:作为一个状态机。
我认为ApprovalProcess是文档所遵循的流,而不是实体。我不知道流程的流程图,但我猜您所称的“步骤”将是文档在过程中可能具有的“状态”,并且在步骤之间进行转换,因此,首先,当您创建一个新文档时,它处于起始步骤,并且在文档的生存期内,它从一个步骤传递到另一个步骤,直到它达到最后一步(例如,文档批准)。
因此,文档实体将具有改变其状态的行为。
例如,在Java中,您可以使用枚举实现状态模式(状态机)。
https://stackoverflow.com/questions/54744590
复制相似问题