• 前置条件

    在开发之前,请确保

    介绍

    demo 需涉及到 app 层的 service 接口类与其实现类。

    特别说明  
    
    为了Demo的完整性,这里使用了`app`层的服务类,如业务十分简单,`api`层亦可直接调用通用的`repository`相关方法,不需要 `app` 服务
    

    service 调用领域对象或服务来解决问题,应用层Service主要有以下特性:

    1. 负责事务处理,所以事务的注解可以在这一层的service中使用。
    2. 只处理非业务逻辑,重点是调度业务处理流程。业务逻辑处理一定要放在领域层处理。
    3. 不做单元测试,只做验收测试。
    4. 可能会有比较多的依赖组件(领域服务),使用field注入依赖的组件。

    Service 接口类

    .1 UserService.java 代码

    package org.hzero.todo.app.service;
    
    import org.hzero.todo.domain.entity.User;
    
    /**
     * 用户应用服务
     */
    public interface UserService {
    
        /**
         * 创建用户
         * 
         * @param user User
         * @return User
         */
        User create(User user);
    
        /**
         * 删除用户(同时删除任务)
         *
         * @param userId 用户ID
         */
        void delete(Long userId);
    }
    

    .2 TaskService.java 代码

    package org.hzero.todo.app.service;
    
    import org.hzero.todo.domain.entity.Task;
    
    /**
     * 任务应用服务
     */
    public interface TaskService {
    
        /**
         * 创建任务
         *
         * @param task 任务
         * @return Task
         */
        Task create(Task task);
    
        /**
         * 更新任务
         *
         * @param task 任务
         * @return Task
         */
        Task update(Task task);
    
        /**
         * 根据任务编号删除
         *
         * @param taskNumber 任务编号
         */
        void deleteByTaskNumber(String taskNumber);
    }
    

    Service 实现类

    .1 UserServiceImpl.java 代码

    package org.hzero.todo.app.service.impl;
    
    import java.util.List;
    import org.apache.commons.collections4.CollectionUtils;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    import io.choerodon.core.exception.CommonException;
    import org.hzero.todo.app.service.UserService;
    import org.hzero.todo.domain.entity.Task;
    import org.hzero.todo.domain.entity.User;
    import org.hzero.todo.domain.repository.TaskRepository;
    import org.hzero.todo.domain.repository.UserRepository;
    
    /**
     * 用户应用服务实现
     */
    @Service
    public class UserServiceImpl implements UserService {
    
        private final TaskRepository taskRepository;
        private final UserRepository userRepository;
    
        public UserServiceImpl(TaskRepository taskRepository, UserRepository userRepository) {
            this.taskRepository = taskRepository;
            this.userRepository = userRepository;
    
        }
    
        @Override
        @Transactional(rollbackFor = Exception.class)
        public User create(User user) {
            userRepository.insert(user);
            return user;
        }
    
        @Override
        @Transactional(rollbackFor = Exception.class)
        public void delete(Long userId) {
            User exist = userRepository.selectByPrimaryKey(userId);
            if (exist == null) {
                throw new CommonException("htdo.warn.user.notFound");
            }
            // 删除用户
            userRepository.deleteByPrimaryKey(userId);
            // 删除与用户关联的任务
            List<Task> tasks = taskRepository.selectByEmployeeId(userId);
            if (CollectionUtils.isNotEmpty(tasks)) {
                taskRepository.batchDelete(tasks);
            }
        }
    }
    

    .2 TaskServiceImpl.java 代码

    package org.hzero.todo.app.service.impl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    import io.choerodon.core.exception.CommonException;
    import org.hzero.todo.app.service.TaskService;
    import org.hzero.todo.domain.entity.Task;
    import org.hzero.todo.domain.repository.TaskRepository;
    
    /**
     * 任务应用服务实现
     */
    @Service
    public class TaskServiceImpl implements TaskService {
    
        @Autowired
        private TaskRepository taskRepository;
    
        @Override
        @Transactional(rollbackFor = Exception.class)
        public Task create(Task task) {
            // 生成任务编号
            task.generateTaskNumber();
            // 插入数据
            taskRepository.insert(task);
            return task;
        }
    
        @Override
        @Transactional(rollbackFor = Exception.class)
        public Task update(Task task) {
            Task exist = taskRepository.selectByPrimaryKey(task);
            if (exist == null) {
                throw new CommonException("htdo.warn.task.notFound");
            }
            // 更新指定字段
            taskRepository.updateOptional(task,
                    Task.FIELD_STATE,
                    Task.FIELD_TASK_DESCRIPTION
            );
            return task;
        }
    
        @Override
        @Transactional(rollbackFor = Exception.class)
        public void deleteByTaskNumber(String taskNumber) {
            Task task = new Task();
            task.setTaskNumber(taskNumber);
            taskRepository.delete(task);
        }
    }