请先参考
项目架构规范:阿里规约,MVC架构以及三层架构(一)
https://blog.csdn.net/lin451791119/article/details/106348414
项目架构规范:阿里规约,MVC架构以及三层架构(二)
https://blog.csdn.net/lin451791119/article/details/106378277
项目架构规范:阿里规约,MVC架构以及三层架构(三)
https://blog.csdn.net/lin451791119/article/details/106396958
分层目录要点
严格区分每层的职责
严格确定分层的调用链路
严禁使用map/json等格式做数据传递
严禁使用BeanUtil.Copy等方法转换
分层目录结构
总体分为应用层、业务领域层和基础设施层
应用层
应用层用于接收外部的请求,是整个系统所提供能力的外观,包含API、MQ-Listener等。专用于处理和业务无关的操作,包含验签、参数校验、拦截等处理,不实现业务逻辑通过编排业务领域和外部请求,对外提供细粒度的能力
- API:接收来自外部的HTTP请求,只做参数校验、业务领域数据组装、业务逻辑编排和响应请求
- MQ:监听消息队列的请求,不做业务处理
- Model:用于封装外部的请求参数、封装响应外部参数,与底层数据存储的结构完全无关
- Assembler:用于Model与业务领域层的Model之间的相互转换工作,例如:使用反射机制自动beanutils相互转换
- Configuration:全局的配置信息或处理,例如:全局参数校验机制、全局异常处理等
业务领域层
业务领域层主要用于实现业务逻辑,包含业务规则、策略和流程
- Model:用于接收或响应来自应用层的业务属性,同时可承载Model的行为避免失血模型。业务层只负责业务,与具体的表现形式无关,所以它返回的Model不应该出现与表现形式的耦合。
- Repository:仓储层用于对持久化通用操作的封装,将领域对象持久化,屏蔽了持久化层的特性
- Service:处理业务逻辑,对Repository和External的操作编排
- External:封装对外部的请求,包含了请求的定义、参数等
基础设施层
基础设施层为以上各层提供技术支持,例如持久化操作、公用的操作等
- Commons:共用的操作类、工具类等
- Persistence:直接面向DB的操作
命名规范
名称 | 描述 | 所属分层 | 示例 | 备注 |
---|---|---|---|---|
Client Request | 客户端请求入参对象 | Facade.model | UserRequest | |
Client Response | 客户端请求响应对象 | Facade.model | UserResponse | |
Domain Object | 领域对象 | Biz.domain | UserDomain | |
Value Object | 值对象 | Biz.domain | UserVO | |
Domain Factory | 领域工厂 | Biz.domain | UserFactory | 创建Domain Object |
Repository | 仓库 | Biz.domain | UserRepository | 对Domain Object的持久化 |
Service | 业务逻辑 | Biz.service | UserService | 处理业务逻辑 |
External Request | 请求外部对象 | Biz.external.model | UserExtRequest | 请求外部接口的入参 |
External Response | 请求外部对象 | Biz.external.model | UserExtResponse | 接收外部接口的响应 |
Data Object | 数据库对象 | Infrastructure.persistence.entity | User | |
Dao Object | 数据库操作对象 | Infrastructure.persistence.mapper | UserMapper |
为什么要分出这个external这个包,是为了以后向微服务架构转型,尤其是Spring+Feign,会带来极大的便利!如果请求远程的服务和服务器提供的服务混杂在一起,整理项目的时候会十分混乱!
分层调用路径
源 | 目标 | 所属层操作 | 备注 |
---|---|---|---|
Client Request | Domain Object | Domain.factory | |
Domain Object | Data Object | Domain.Repository | 意味着Domain Object可以出现在Factory、Service和Repository层 |
Domain Object | Client Response | Facade.api | 拿到业务层的返回的Domain Object后,转换成客户端能识别的Client Response |