领域建模的贫血模型与充血模型
贫血模型
此种模型下领域对象的作用很简单,只有所有属性的get/set方式,以及少量简单的属性值转换,不包含任何业务逻辑,不关系对象持久化,只是用来做为数据对象的承载和传递的介质。而真正的业务逻辑则由领域服务负责实现,此服务引入持久化仓库,在业务逻辑完成之后持久化到仓库中。我们项目中经常使用的 MVC三层架构 就是这种。
@Entity
@Data
public class User {
@Id
private String userId;
private String userName;
private String password;
private boolean isLock;
}
充血模型
此种模型下领域对象作用此领域相关行为,包含此领域相关的业务逻辑,同时也包含对领域对象的持久化操作。
@Entity
@Data
@Builder
@AllArgsConstructor
public class User implements UserService {
@Id
private String userId;
private String userName;
private String password;
private boolean isLock;
// 持久化仓库
@Transient
private UserRepository repo;
// 是否是持久化对象
@Transient
private boolean isRepository;
@PostLoad
public void per() {
isRepository = true;
}
public User() {
}
public User(UserRepository repo) {
this.repo = repo;
}
@Override
public void create(User user) {
repo.save(user);
}
@Override
public void edit(User user) {
if (!isRepository) {
throw new RuntimeException("用户不存在");
}
userName = user.userName;
repo.save(this);
// 发布领域事件 ...
}
@Override
public void lock() {
if (!isRepository) {
throw new RuntimeException("用户不存在");
}
isLock = true;
repo.save(this);
// 发布领域事件 ...
}
}
MybatisPlus 框架就支持这种模型,通过定义一个实体类继承 com.baomidou.mybatisplus.extension.activerecord.Model。
总结
项目中经常使用的还是贫血模型。
参考
领域建模的贫血模型与充血模型
DDD(领域驱动设计),你必须知道的贫血模型和充血模型
小书MybatisPlus第5篇-Active Record模式精讲