【问题标题】:DDD - How do you create a new instance or load the aggregate root? [duplicate]DDD - 如何创建新实例或加载聚合根? [复制]
【发布时间】:2018-10-22 15:24:39
【问题描述】:

在项目中开始使用 ddd 后,我拥有以下架构:

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

注意:我只有一个 AR,因为它应该是一个微服务,我在这里只谈论“命令”方面。

我需要 2 种方法来实例化 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 中使用构造函数绕过所有验证的想法)

关于如何优雅地做到这一点的任何想法?

【问题讨论】:

  • 是春季项目吗?
  • 是的,这是一个春季项目!
  • 我不确定这是否与技术有关。不要创建聚合根。相反,您应该通过它的身份加载您的聚合。如果存在,则返回能够加载的状态。如果没有,则初始化默认状态。然后你应用你的命令,聚合应该能够告诉你你的命令是否有效。
  • 例如我用一个空数据库启动我的应用程序,我想创建一个用户。在不创建 AR 的情况下如何做到这一点?我知道我可以通过它的 id 检索它并稍后修改它,但在此之前它是如何工作的?

标签: java domain-driven-design


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2016-03-21
    • 2019-06-29
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多