该层指的是服务端用于适配端侧的部分,而非端侧本身。因为该层本就依赖应用层,无人使用接口在这里做依赖倒置,所有又被称作主动适配。
- assembler、dto 和 façade
facade
提供较粗粒度的调用接口,将用户请求委派给一个或多个应用服务进行处理。比如调用应用层创建用户的方法。
dto
数据传输的载体,内部不存在任何业务逻辑,可以通过DTO把内部的领域对象与外界隔离。
比如接收请求传入的数据CustomerDTO。
不同的对象在不同的层转换。用户接口层DTO和DO转换,应用层主要是DO,调外部微服务的服务的时候应用层有dto和do的转换。领域层与基础层之间,在基础层有DO和PO的转换。
在接口层定义DTO对象。数据可能来源于多个DO对象。
assembler
实现DTO与DO间的相互转换和数据交换。
一般assembler与dto一同出现。比如创建用户时,将CustomerDTO转换为CustomerEntity。你可以在用户接口层创建DTO类和assembler类。在assembler类里完成映射。
特点
-
关心处理完一个完整的业务
-
该层只负责业务编排,对象转换,实际业务逻辑由领域层完成
-
不关心【请求从何处来】,但是关心【谁来、做什么、有没有权限做】
即复制安全认证、权限校验
- 集成不同的领域服务解决问题
应用层位于领域层之上,因为领域层包含多个聚合,所以它可协调多个聚合服务和领域对象完成服务编排和组合,协作完成业务。
-
最终一致性(最终一致性对业务有侵入)事务放到这层
-
对应到分布式系统中的中台等概念
-
方法级别的功能权限控制放到这层
-
只产应用异常,对应 HTTP 状态码 403、401
-
准单体系统下,按照应用划分模块
主要包含应用服务,理论上不应有业务规则或逻辑,而主要是面向用例和流程相关的操作。
- 应用层也是微服务间的交互通道,它可调用其它微服务,完成微服务间的服务组合和编排。
开发设计时,不要将本该放在领域层的业务逻辑放到应用层。庞大的应用层会使领域模型失焦,时间一长,微服务就会退化为MVC。
应用服务是在应用层,负责
-
服务的组合、编排、转发、转换和传递,处理业务用例的执行顺序以及结果的拼装,以粗粒度服务通过API网关发布到前端
-
发送或订阅领域事件
应用层代码目录结构
存放应用层服务组合和编排相关的代码。
应用服务向下基于
-
微服务内的领域服务,或
-
外部微服务的应用服务
完成服务的编排和组合
向上为用户接口层提供各种应用数据展现支持服务。
应用服务和事件等代码会放在这层目录。
Event(事件)
主要存放事件相关代码。包括两子目录:
publish
主要存放事件发布相关代码。比如发布用户创建事件给其它微服务。
subscribe
主要存放事件订阅相关代码(事件处理相关的核心业务逻辑在领域层实现)。
虽然应用层和领域层都可进行事件的发布和处理,但为实现事件的统一管理,推荐将微服务内所有事件的发布和订阅处理都