参考:
盒马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简单实现