前置条件

在开发之前,请确保

介绍

demo需涉及到demain层的entityconvertor、多entityservicerepository接口类以及infra层的repository实现类

编写entity

  • entity 类需提供属性及简单行为
  • 创建在 项目模块 的 xxx.domain.[模块名称] 包下。如:xxx.domain.todo
  • 每一个 entity 类对应一个 DO 类,所以命名为 DO 类名尾缀替换为 E。如:TaskE 对应 DOTaskDO

属性规范

  • 所有属性均为private属性。
  • 每一个属性需要生成对应的 getter 方法,不允许生成 setter 方法。
  • 需添加Long类型属性 objectVersionNumber ,用以更新数据时的版本控制。

TaskE.java 代码

  1. package io.choerodon.todo.domain.todo.entity;
  2. public class TaskE {
  3. private Long id;
  4. private Long employeeId;
  5. private String state;
  6. private String taskNumber;
  7. private String taskDescription;
  8. private Long objectVersionNumber;
  9. public TaskE(Long id, Long employeeId, String state, String taskNumber, String taskDescription, Long objectVersionNumber) {
  10. this.id = id;
  11. this.employeeId = employeeId;
  12. this.state = state;
  13. this.taskNumber = taskNumber;
  14. this.taskDescription = taskDescription;
  15. this.objectVersionNumber = objectVersionNumber;
  16. }
  17. // 更新状态
  18. public void updateState(String state) {
  19. this.state = state;
  20. }
  21. // 省略get方法
  22. }

UserE.java 代码

  1. package io.choerodon.todo.domain.todo.entity;
  2. public class UserE {
  3. private Long id;
  4. private String employeeName;
  5. private String employeeNumber;
  6. private String email;
  7. private Long objectVersionNumber;
  8. public UserE(Long id, String employeeName, String employeeNumber, String email, Long objectVersionNumber) {
  9. this.id = id;
  10. this.employeeName = employeeName;
  11. this.employeeNumber = employeeNumber;
  12. this.email = email;
  13. this.objectVersionNumber = objectVersionNumber;
  14. }
  15. // 省略get方法
  16. }

编写Convertor 类

  • convertor用于EntityDODTO三者之间的转换,需继承ConvertorI<E, D, T>接口,EDT对应具体的EntityDODTO
  • 每一个 convertor 类对应一组EDT,所以命名为同组类名尾缀替换为 Convertor。如:TaskConvertor
  • 需要通过@Component纳入spring管理。

创建对应的DTO 类。

io.choerodon.todo.api.dto包下创建DTO类。

  1. // UserDTO
  2. package io.choerodon.todo.api.dto;
  3. public class UserDTO {
  4. private Long id;
  5. private String employeeName;
  6. private String employeeNumber;
  7. private String email;
  8. private Long objectVersionNumber;
  9. // 省略get和set方法
  10. }
  1. // TaskDTO
  2. package io.choerodon.todo.api.dto;
  3. public class TaskDTO {
  4. private Long id;
  5. private Long employeeId;
  6. private String state;
  7. private String taskNumber;
  8. private String taskDescription;
  9. private Long objectVersionNumber;
  10. // 省略get和set方法
  11. }

UserConvertor.java 代码

  1. package io.choerodon.todo.domain.todo.convertor;
  2. // 省略 import
  3. @Component
  4. public class UserConvertor implements ConvertorI<UserE, UserDO, UserDTO> {
  5. @Override
  6. public UserE dtoToEntity(UserDTO dto) {
  7. return new UserE(
  8. dto.getId(),
  9. dto.getEmployeeName(),
  10. dto.getEmployeeNumber(),
  11. dto.getEmail(),
  12. dto.getObjectVersionNumber()
  13. );
  14. }
  15. @Override
  16. public UserDTO entityToDto(UserE entity) {
  17. UserDTO UserDTO = new UserDTO();
  18. BeanUtils.copyProperties(entity, UserDTO);
  19. return UserDTO;
  20. }
  21. @Override
  22. public UserE doToEntity(UserDO dataObject) {
  23. return new UserE(
  24. dataObject.getId(),
  25. dataObject.getEmployeeName(),
  26. dataObject.getEmployeeNumber(),
  27. dataObject.getEmail(),
  28. dataObject.getObjectVersionNumber()
  29. );
  30. }
  31. @Override
  32. public UserDO entityToDo(UserE entity) {
  33. UserDO UserDO = new UserDO();
  34. BeanUtils.copyProperties(entity, UserDO);
  35. return UserDO;
  36. }
  37. @Override
  38. public UserDTO doToDto(UserDO dataObject) {
  39. UserDTO UserDTO = new UserDTO();
  40. BeanUtils.copyProperties(dataObject, UserDTO);
  41. return UserDTO;
  42. }
  43. public UserDO dtoToDo(UserDTO dto) {
  44. UserDO UserDO = new UserDO();
  45. BeanUtils.copyProperties(dto, UserDO);
  46. return UserDO;
  47. }
  48. }

TaskConvertor.java 代码

  1. package io.choerodon.todo.domain.todo.convertor;
  2. // 省略 import
  3. @Component
  4. public class TaskConvertor implements ConvertorI<TaskE, TaskDO, TaskDTO> {
  5. @Override
  6. public TaskE dtoToEntity(TaskDTO dto) {
  7. return new TaskE(
  8. dto.getId(),
  9. dto.getEmployeeId(),
  10. dto.getState(),
  11. dto.getTaskNumber(),
  12. dto.getTaskDescription(),
  13. dto.getObjectVersionNumber()
  14. );
  15. }
  16. @Override
  17. public TaskDTO entityToDto(TaskE entity) {
  18. TaskDTO taskDTO = new TaskDTO();
  19. BeanUtils.copyProperties(entity, taskDTO);
  20. return taskDTO;
  21. }
  22. @Override
  23. public TaskE doToEntity(TaskDO dataObject) {
  24. return new TaskE(
  25. dataObject.getId(),
  26. dataObject.getEmployeeId(),
  27. dataObject.getState(),
  28. dataObject.getTaskNumber(),
  29. dataObject.getTaskDescription(),
  30. dataObject.getObjectVersionNumber()
  31. );
  32. }
  33. @Override
  34. public TaskDO entityToDo(TaskE entity) {
  35. TaskDO taskDO = new TaskDO();
  36. BeanUtils.copyProperties(entity, taskDO);
  37. return taskDO;
  38. }
  39. @Override
  40. public TaskDTO doToDto(TaskDO dataObject) {
  41. TaskDTO taskDTO = new TaskDTO();
  42. BeanUtils.copyProperties(dataObject, taskDTO);
  43. return taskDTO;
  44. }
  45. public TaskDO dtoToDo(TaskDTO dto) {
  46. TaskDO taskDO = new TaskDO();
  47. BeanUtils.copyProperties(dto, taskDO);
  48. return taskDO;
  49. }
  50. }

编写Repository

Repository 接口类

  • Repository 接口类定义了数据操作的一系列接口,并不提供实现,具体实现需要通过 Repository实现层提供。创建在项目模块的 xxx.domain.repository 包下。
  • 每一个 Repository 对应一个 entity ,所以命名为 entity 类名尾缀替换为 Repository。如:TaskRepository 对应 TaskE

UserRepository.java 代码

  1. package io.choerodon.todo.domain.repository;
  2. import io.choerodon.todo.domain.todo.entity.UserE;
  3. public interface UserRepository {
  4. UserE create(UserE userE);
  5. }

TaskRepository.java 代码

  1. package io.choerodon.todo.domain.repository;
  2. import io.choerodon.todo.domain.todo.entity.TaskE;
  3. public interface TaskRepository {
  4. TaskE create(TaskE taskE);
  5. void deleteById(Long id);
  6. void deleteByTaskNumber(String taskNumber);
  7. TaskE update(TaskE taskE);
  8. TaskE queryById(Long id);
  9. }

Repository 实现类

  • Repository 接口的集体实现。创建在项目模块的 xxx.infra.repository.impl 包下。
  • 每一个 Repository 实现类对应一个 Repository 接口类,所以命名为 Repository 接口类名 + Impl。如:TaskRepositoryImpl 对应 TaskRepository
  • 需要通过@Component纳入spring管理。

UserRepositoryImpl.java 代码

  1. package io.choerodon.todo.infra.repository.impl;
  2. // 省略 import
  3. @Component
  4. public class UserRepositoryImpl implements UserRepository {
  5. private UserMapper userMapper;
  6. private UserConvertor userConvertor;
  7. public UserRepositoryImpl(UserMapper userMapper, UserConvertor userConvertor) {
  8. this.userMapper = userMapper;
  9. this.userConvertor = userConvertor;
  10. }
  11. @Override
  12. public UserE create(UserE userE) {
  13. UserDO userDO = userConvertor.entityToDo(userE);
  14. List<UserDO> userDOList = userMapper.select(userDO);
  15. if (!userDOList.isEmpty()) {
  16. throw new CommonException("error.repo.create.user.exist");
  17. }
  18. if (userMapper.insertSelective(userDO) != 1) {
  19. throw new CommonException("error.repo.create.user.failed");
  20. }
  21. return userConvertor.doToEntity(userMapper.selectByPrimaryKey(userDO.getId()));
  22. }
  23. }

TaskRepositoryImpl.java 代码

  1. package io.choerodon.todo.infra.repository.impl;
  2. // 省略 import
  3. @Component
  4. public class TaskRepositoryImpl implements TaskRepository {
  5. private TaskMapper taskMapper;
  6. private TaskConvertor taskConvertor;
  7. public TaskRepositoryImpl(TaskMapper taskMapper, TaskConvertor taskConvertor) {
  8. this.taskMapper = taskMapper;
  9. this.taskConvertor = taskConvertor;
  10. }
  11. @Override
  12. public TaskE create(TaskE taskE) {
  13. TaskDO taskDO = taskConvertor.entityToDo(taskE);
  14. List<TaskDO> taskDOList = taskMapper.select(taskDO);
  15. if (!taskDOList.isEmpty()) {
  16. throw new CommonException("error.repo.create.task.exist");
  17. }
  18. if (taskMapper.insertSelective(taskDO) != 1) {
  19. throw new CommonException("error.repo.create.task.failed");
  20. }
  21. return new TaskConvertor().doToEntity(taskMapper.selectByPrimaryKey(taskDO.getId()));
  22. }
  23. @Override
  24. public TaskE queryById(Long id) {
  25. return taskConvertor.doToEntity(taskMapper.selectByPrimaryKey(id));
  26. }
  27. @Override
  28. public void deleteById(Long id) {
  29. if (taskMapper.selectByPrimaryKey(id) == null) {
  30. throw new CommonException("error.task.not.exist");
  31. }
  32. if (taskMapper.deleteByPrimaryKey(id) != 1) {
  33. throw new CommonException("error.task.delete");
  34. }
  35. }
  36. @Override
  37. public void deleteByTaskNumber(String taskNumber) {
  38. TaskDO taskDO = taskMapper.queryByTaskNumber(taskNumber);
  39. if (taskDO == null) {
  40. throw new CommonException("error.task.not.exist");
  41. }
  42. if (taskMapper.deleteByPrimaryKey(taskDO.getId()) != 1) {
  43. throw new CommonException("error.task.delete");
  44. }
  45. }
  46. @Override
  47. public TaskE update(TaskE taskE) {
  48. TaskDO taskDO = taskConvertor.entityToDo(taskE);
  49. if (taskMapper.updateByPrimaryKeySelective(taskDO) != 1) {
  50. throw new CommonException("error.task.update");
  51. }
  52. return taskConvertor.doToEntity(taskMapper.selectByPrimaryKey(taskDO.getId()));
  53. }
  54. }

编写Service

Domain Service 接口类

  • 领域层的Service 是业务软件的核心,是反应多个领域模型的业务情况的具体实现,是领域模型对外提供的实际服务。
  • Service 接口类定义了业务操作的一系列接口,并不提供实现,具体实现需要通过服务实现层提供,所以属于供应方的服务接口层。创建在项目模块 的 xxx.domain.service 包下。
  • 每一个 Service 对应多个 entity 类,因需要与appservice区分,所以规定命名为 I + 涉及主要entity类名 + Service。如:ITaskService

Service 实现类

  • Service 接口的具体实现通过服务实现层提供,所以属于供应方的服务实现层。创建在项目模块的 xxx.domian.service.impl 包下。
  • 实现类,如无特殊情况,需要用 @Service 标注,以自动扫描注册