应用分层

概述

关于应用的分层架构,长期以来使用最广的就是经典三层架构(UI展示层,BLL业务逻辑层,DAL数据访问层),近几年DDD的架构逐步兴起(接口层、应用服务层、领域服务层和基础设施层)。以下主要对经典三层架构及其模型对象进行说明(Macula没有强制使用哪种分层架构,看具体的场景和团队情况选择适合的分层架构即可)。

经典三层架构

架构图

经典三层架构如下图所示:

image

工程目录

image

各层规约

展示层

  1. 【强制】Controller方法不要直接返回Result包裹类,框架会根据返回结果自动封装为Result结构返回,具体见Macula Boot Starter Web
  2. 【强制】Controller方法体里面不要编写业务逻辑,只做简单的Service方法的编排
  3. 【推荐】Controller方法参数建议添加@Validated注解,用于参数校验
  4. 【强制】Controller方法不要吃掉异常,如果没有特殊需要,直接抛出服务层异常即可

业务逻辑层

  1. 【强制】Service方法需要考虑事务,一个Service方法应该是事务一致的
  2. 【强制】Service方法需要根据错误情况抛出对应异常,抛出的异常要继承自BizException

数据存取层

  1. 【推荐】建议使用mybatis-plus或者jpa框架
  2. 【强制】不要通过拼接字符串的方式编写SQL
  3. 【强制】不要在Java代码中拼接SQL

各层对象传递说明(Query,Form,DTO,VO,BO,Entity)

业内涉及分层架构的模型对象多种多样,如VO、DTO、AO、BO、PO、DO、Entity等,但大家的理解和用法各异。在此,Macula选取以下模型并明确定义其使用场景,如下图所示:

image

  • Query查询对象:查询的时候使用,可以透传Controller,Service,Mapper三层
  • Form表单对象和DTO传输对象:更新的时候使用
  • VO视图对象:返回结果的时候使用
  • BO业务对象:由SQL联合多表查询返回的对象,或者由多个Entity组合的对象
  • Entity实体对象:与数据库表一一对应的实体对象,与PO等价

以上模型对象的定义和使用,同样适用于平台内部微服务间的调用以及跨平台的openapi交互场景。如下图所示:

image

详细样例请看:https://github.com/macula-projects/macula-samples

DDD架构

TODO