【发布时间】: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 检索它并稍后修改它,但在此之前它是如何工作的?