Skip to content

应用层

应用层是领域驱动设计中最核心的一层,它是领域层和基础设施层的桥梁。应用层的主要职责是将领域层的业务逻辑转换为可执行的操作,同时也负责处理领域层的业务规则和约束。

application 应用层

这一层主要是用于领域层和用户接口层的协调层,用于两层之间的数据转换和业务协调(注意,这里的应用服务是不会涉及到领域的业务逻辑

本框架将应用层的功能拆分成了命令查询,也就是使用了CQRS模式。这样使得应用层的功能更加清晰,更加易于维护和扩展。

│   ├── application
│   │   ├── service - 应用服务
│   │   │   ├── command - 命令对象
│   │   │   │   ├── handler
│   │   │   │   │   ├── XXXCommandHandler.java
│   │   │   │   ├── mappper
│   │   │   │   │   ├── XXXCommandMapper.java
│   │   │   │   ├── XXXXCommand.java
│   │   │   ├── query - 查询对象
│   │   │   │   ├── handler
│   │   │   │   │   ├── XXXQueryHandler.java
│   │   │   │   ├── mappper
│   │   │   │   │   ├── XXXQueryMapper.java
│   │   │   │   ├── XXXXQuery.java
│   │   ├── repository - 查询侧仓储层
│   │   │   ├── XXXRepository.java
│   │   ├── assembler - 领域对象和命令对象转换器
│   │   │   ├── XXXAssembler.java
  1. XXXCommandXXXQuery:是CQRS模式中的命令对象和查询对象, 它们是应用层的接口,用于定义应用层的输入。

    java
    // 命令对象
    // 继承了Command<Void>接口,才能被框架处理器识别
    public class CreateApiCommand implements Command<Void>  { 
        private Long id;
        private Long module;
        private String name;
        private String access;
        private Integer type;
        private Boolean enabled;
        private Boolean deleted;
    }
    
    // 查询对象
    // 继承了Query<ApiVO>接口,才能被框架处理器识别
    public class GetApiDetailQuery implements Query<ApiVO> {
        private Long id;
    }
  2. XXXCommandHandlerXXXQueryHandler:是命令对象和查询对象的处理器, 它们是应用层的实现,用于处理命令对象和查询对象。 可以把这个处理器理解为应用服务,它是对领域业务进行协调和编排的。真正的业务逻辑需要在领域层完成。

    java
    // 命令对象处理器
    // 继承了CommandHandler接口,才能被框架处理器识别
    public class CreateApiCommandHandler implements CommandHandler<CreateApiCommand, Void> {
        @Autowired
        private ApiRepository apiRepository;
        @Override
        public Void execute(CreateApiCommand command) {
            Api api = ApiAssembler.INSTANCE.covertToApi(command); //转换成领域对象
            apiRepository.save(api); // 持久化领域对象
            return null;
        }
    }
    
    // 查询对象处理器
    // 继承了QueryHandler接口,才能被框架处理器识别
    public class GetApiDetailQueryHandler implements QueryHandler<GetApiDetailQuery, ApiVO> {
        @Autowired
        private ApiRepository apiRepository;
        @Override
        public ApiVO execute(GetApiDetailQuery query) {
            Api api = apiRepository.getById(query.getId()); // 查询领域对象
            return ApiAssembler.INSTANCE.covertToApiVO(api); // 转换成视图对象
        }
    }
  3. XXXCommandMapperXXXQueryMapper:是命令对象和查询对象的转换器, 主要是将用户接口层的输入转换为应用层的输入,处理成应用层的命令对象和查询对象。

    java
    // 命令对象转换器
    @Mapper
    public class ApiCommandMapper {
        public static final ApiCommandMapper INSTANCE = Mappers.getMapper(ApiCommandMapper.class);
        public CreateApiCommand covertToCreateApiCommand(CreateApiForm createApiForm)
    }
    
    // 查询对象转换器
    @Mapper
    public class ApiQueryMapper {
        public static final ApiQueryMapper INSTANCE = Mappers.getMapper(ApiQueryMapper.class);
        public GetPageApiQuery covertToGetPageApiQuery(QueryApiForm queryApiForm)
    }
  4. XXXRepository:是查询侧仓储层,用于查询领域对象。 这里放的是查询侧的仓库接口,比如针对复杂的报表查询,需要在应用层进行数据的组装和处理。

    java
    public interface ApiRepository extends BaseRepository<Api> {
        Api getById(Long id);
    }
  5. XXXAssembler:是领域对象和命令对象转换器,用于将领域对象转换为命令对象。 这里放的是领域对象和命令对象转换器的接口,比如针对复杂的业务逻辑,需要在应用层进行数据的组装和处理。

    java
    public class ApiAssembler {
        public static final ApiAssembler INSTANCE = Mappers.getMapper(ApiAssembler.class);
        public Api covertToApi(CreateApiCommand command)
    }