领域建模的贫血模型与充血模型

贫血模型

此种模型下领域对象的作用很简单,只有所有属性的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模式精讲

posted @ 2024-03-01 20:31  strongmore  阅读(25)  评论(0编辑  收藏  举报