DDD-如何创建新实例或加载聚合根?

时间:2018-10-22 15:24:39

标签: java domain-driven-design

在项目中开始使用ddd之后,我具有以下体系结构:

  • 包含我的聚合根(AR),我的实体和我的值对象的域模型
  • 存储库接口(在基础结构部分中实现)
  • 应用程序服务来创建,删除和更新AR。用于更新AR的应用程序服务以这种方式工作:从数据库中的ID查找AR,调用某些方法,然后将其保存在数据库中

Nb:我只有一个AR,因为它应该是微服务,在这里我只说“命令”。

我需要两种实例化AR的方法:

  • 调用应用程序服务以根据输入创建AR时的一个
  • 从数据库中检索现有的AR时,我真的不想做所有检查

在第一种情况下,我需要创建一个ID,进行一些检查等。 在第二种情况下,我只想从数据库中包含的数据重新创建AR。

我应该如何/在哪里做?

对于通过输入进行的创建,我可以在应用程序服务中做到这一点(这是一个简单的示例):

public class CreateUser {

  private final UserRepository userRepository;

  public User execute(String name) {
    User user = new User(UUID.randomUUID(), name);
    return userRepository.create(user);
  }
}

要从数据库加载AR,我可以:

  • 用户使用同一构造函数进行验证
  • 创建一个没有验证的新对象(我真的不喜欢让AR中的构造函数绕过所有验证的想法)

关于如何优雅地进行此操作的任何想法?

1 个答案:

答案 0 :(得分:0)

从数据库加载聚合时,使用构造函数创建聚合的新实例的概念是错误的。您不必调用任何构造函数,工厂或验证任何字段。只需使用getAggregateOfId方法从存储库中获取它,该方法将返回已构造的聚合,并使用数据库中存储的状态进行构建。