DDD(领域驱动设计)实战

参考:
盒马DDD:https://blog.csdn.net/alitech2017/article/details/81905075
BRAC模型:https://www.cnblogs.com/zwq194/archive/2011/03/07/1974821.html

背景

针对于火热的DDD背景下,缺少实战的demo。在此使用一个BRAC(Role-Based Access Control,基于角色的访问控制)模型的案例,使用DDD来架构来实现。

对于领域的划分,可能存在一定差异,这并不是标准!!!

分析

BRAC基于角色的访问控制,所以领域模型我定位一个角色领域模型,该领域,提供对角色拥有的用户、权限修改(addPerimission和addUser)这两个功能。

项目结构图如下

image.png

其中的RoleDomainService就相当于传统的service,在domainService中呢,通过factory构建领域对象(Role),然后执行相关的业务操作
详情关注addPermissionList和addUserList方法

@Service
public class RoleDomainService {

    private final RoleFactory roleFactory;
    private final RoleRepository roleRepository;

    @Autowired
    public RoleDomainService(RoleFactory roleFactory, RoleRepository roleRepository) {
        this.roleFactory = roleFactory;
        this.roleRepository = roleRepository;
    }

    public int save(RoleDTO roleDTO) {
        return roleRepository.save(roleDTO);
    }

    public int addPermissionList(String identity, List<PermissionDTO> permissionDTOList) {
        // 通过factory构造领域对象
        Role role = roleFactory.create(RoleDTO.builder()
                .roleId(identity)
                .build());
        return role.addPermission(permissionDTOList);
    }

    public int addUserList(String identity, List<UserDTO> userDTOList) {
        // 通过factory构造领域对象
        Role role = roleFactory.create(RoleDTO.builder()
                .roleId(identity)
                .build());
        return role.addUserList(userDTOList);
    }

}


下面是Role领域对象中的代码

/**
 * 领域对象
 */
public class Role {

    private Long id;
    private String roleId;
    private String name;

    private PermissionRepository permissionRepository;
    private UserRepository userRepository;

    public Role(Long id, String roleId, String name, PermissionRepository permissionRepository, UserRepository userRepository) {
        this.id = id;
        this.roleId = roleId;
        this.name = name;
        this.permissionRepository = permissionRepository;
        this.userRepository = userRepository;
    }

    /**
     * 给角色赋予权限,属于角色自己的能力
     */
    public int addPermission(List<PermissionDTO> permissionDTOList) {
        // todo
        return 0;
    }

    /**
     * 给角色新增用户,属于角色自己的能力
     */
    public int addUserList(List<UserDTO> userDTOList) {
        // todo
        return 0;
    }
}

其中的RoleQueryService便是直接执行查询的业务类,因为使用领域执行查询,比较会很麻烦,所以对于一些查询功能,可以直接使用该类来实现

@Service
public class RoleQueryService {

    @Autowired
    private RoleDAO roleDAO;

    public List<UserDTO> getUserListByIdentity(String identity) {
        return null;
    }

    public List<PermissionDTO> getPermissionListByIdentity(String identity) {
        return null;
    }

}

以上就是依据BRAC的DDD简单实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容