应用层
应用层是领域驱动设计中最核心的一层,它是领域层和基础设施层的桥梁。应用层的主要职责是将领域层的业务逻辑转换为可执行的操作,同时也负责处理领域层的业务规则和约束。
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
XXXCommand
和XXXQuery
:是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; }
XXXCommandHandler
和XXXQueryHandler
:是命令对象和查询对象的处理器, 它们是应用层的实现,用于处理命令对象和查询对象。 可以把这个处理器理解为应用服务,它是对领域业务进行协调和编排的。真正的业务逻辑需要在领域层完成。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); // 转换成视图对象 } }
XXXCommandMapper
和XXXQueryMapper
:是命令对象和查询对象的转换器, 主要是将用户接口层的输入转换为应用层的输入,处理成应用层的命令对象和查询对象。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) }
XXXRepository
:是查询侧仓储层,用于查询领域对象。 这里放的是查询侧的仓库接口,比如针对复杂的报表查询,需要在应用层进行数据的组装和处理。javapublic interface ApiRepository extends BaseRepository<Api> { Api getById(Long id); }
XXXAssembler
:是领域对象和命令对象转换器,用于将领域对象转换为命令对象。 这里放的是领域对象和命令对象转换器的接口,比如针对复杂的业务逻辑,需要在应用层进行数据的组装和处理。javapublic class ApiAssembler { public static final ApiAssembler INSTANCE = Mappers.getMapper(ApiAssembler.class); public Api covertToApi(CreateApiCommand command) }