Domain driven design DDD:建模收件箱和SentBox

Domain driven design DDD:建模收件箱和SentBox,domain-driven-design,Domain Driven Design,我们正在为文档管理和跟踪领域创建一个应用程序。在此应用程序中,文档是一个集合。有一个先决条件,即如果收件箱中有文档,用户可以处理该文档,类似地,用户可以对其发送框中的文档执行某些操作。我们正在考虑如何对收件箱和邮箱进行建模。我们还有一个名为DocumentMovement的聚合 @Aggregate class DocumentMovement{ MovementId id; User from; User to; Date movedOn; Stri

我们正在为文档管理和跟踪领域创建一个应用程序。在此应用程序中,文档是一个集合。有一个先决条件,即如果收件箱中有文档,用户可以处理该文档,类似地,用户可以对其发送框中的文档执行某些操作。我们正在考虑如何对收件箱和邮箱进行建模。我们还有一个名为DocumentMovement的聚合

 @Aggregate
 class DocumentMovement{
    MovementId id;
    User from;
    User to;
    Date movedOn;
    String remarks;
 }

@ValueObject
Class User{
    String userId;
}
解决方案1: 我们可以将收件箱和发送框建模为值对象,如下所示

@ValueObject
enum State{
     INBOX, SENTBOX;
}

@Aggregate
class Document{
    DocumentId id;
    User currentlyWith;
    State currentState;
}
解决方案2:我们可以将收件箱和发送框建模为聚合

@Aggregate
class UserInbox {
   String userId;
   List<Document> documents;
   public void addDocument(Document doc);
   public void removeDocument(Document doc);
   public boolean isDocumentPresent(DocumentId doc);
}

@Aggregate
class UserSentBox {
   String userId;
   List<Document> documents;
   public void addDocument(Document doc);
   public boolean isDocumentPresent(DocumentId doc);
}
我们想知道这3个解决方案中哪一个正确反映了该领域,或者是否有其他方法可以做到这一点

有一个先决条件,即用户可以处理文档(如果是) 可在他的收件箱中找到

如果处理文档意味着更改文档AR的状态,那么在文档边界内具有inbox/sentbox状态是唯一允许您以高度一致的方式保护该不变量的设计,而无需对每个事务修改多个AR

   interface UserInboxService {
      public boolean isDocumentPresent(DocumentId doc);
   }

   interface UserSentBoxService {
      public boolean isDocumentPresent(DocumentId doc);
   }