【发布时间】:2019-10-20 14:54:05
【问题描述】:
我是 DDD 的新手,我想就我在实施它时面临的一些挑战提供一些建议。
我正在使用 Typescript 开发应用程序。数据保存在关系数据库中。我们没有遵循 CQRS 模式,我们的读取和写入发生在同一个数据库中。
假设我有一个聚合 User 大致如下所示,
class User extends AggregateRoot {
id: number;
phone: Phone;
email: Email;
address: Address;
private constructor(id, phone, email, address){
//setting the values
}
public static create(props) {
return new User({...props});
}
public static update(props) {
return new User({...props});
}
}
这里,Phone 和 Email 是 ValueObjects 和 Address 是 Entity。
class Phone extends ValueObject {
phNumber: string;
private constructor( ph ) {
phNumber = ph;
}
public static create(ph){
//do validations
return new Phone(ph);
}
}
Email 类也类似于Phone。
现在,一旦控制器收到更新手机请求,请求就会被转发到User Service层,服务大致如下所示,
public updatePhone( updatePhNoDto ) {
const userEntity = userRepository.getUser(updatePhNoDto.userId);
const userModel = User.update({
id: updatePhNoDto.userId,
phone: Phone.create(userEntity.phone),
email: Email.create(userEntity.email),
address: Address.create(userEntity.address)
});
userRepository.updateUser(userModel)
}
这里每次用户请求更新电话号码时,我都会从 RDBMS 中获取用户数据并对所有已验证的字段进行所有验证,然后调用方法 User.update()。
所以,这是我的问题:
- 不确定上述方法是否正确,因为我正在验证我已经验证过的东西,并且可能是不必要的数据库调用。因此,请向我建议最佳做法,以处理此类要求更新单个或仅几个字段的情况。
- 用户可以独立于他的其他信息更新他的地址。那么,
Address实体本身应该是Aggregate Root吗?如果是,如果在一个http-request中同时请求更新UserInfo和Address,应该如何处理? - 聚合根在删除中的作用是什么?里面应该如何建模?
如果您在设计中发现任何其他缺陷,请告诉我。
谢谢!
【问题讨论】:
标签: design-patterns domain-driven-design aggregateroot ddd-service