编写版本:v3.5.3
适用版本:所有

代码分层调用

概述

了解IFORM代码分层调用,更快地进行代码开发。在开始接触IFORM代码前,请先阅读本文档。如果对于IFORM微服务代码层次不清楚的,请看这里。

简述:架构主要分为三层:接口层、服务层以及资源层。后端具体的代码调用围绕着服务层以及资源层展开,对应于代码标准结构均以骨架项目为例:
文件路径 层次 细节层次 备注
iform-skeleton-root/modules/skeleton-model-root/modules/skeleton-model/src/main/resources/com/ak/iform/skeleton/persistence/mapping 资源层 xml 编写mybatis的xml代码
iform-skeleton-root/modules/skeleton-model-root/modules/skeleton-model/src/main/java/com/ak/iform/skeleton/persistence/entity 资源层 实体类 PO和Tbl后缀的2个实体类
iform-skeleton-root/modules/skeleton-biz-root/modules/skeleton-biz/src/main/java/com/ak/iform/skeleton/persistence/dao 服务层 数据操作Dao和数据查询QueryDao 调用xml的sql,实现增、删、改、查的持久层代码
iform-skeleton-root/modules/skeleton-biz-root/modules/skeleton-biz/src/main/java/com/ak/iform/skeleton/domain 服务层 领域Domain 调用dao层的代码,再编写业务逻辑代码
iform-skeleton-root/modules/skeleton-biz-root/modules/skeleton-biz/src/main/java/com/ak/iform/skeleton/repository 服务层 仓库Repository 只调用Dao层下的QueryDaod代码,即只做查询、读取数据的业务代码,此层默认增加缓存机制
iform-skeleton-root/modules/skeleton-provider-base-root/modules/provider-skeleton-api 服务层 服务接口 RestController 定义接口路径
iform-skeleton-root/modules/skeleton-provider-base-root/modules/provider-skeleton-client 服务层 接口层FeignClient 定义跨服务调用接口
iform-skeleton-root/modules/skeleton-provider-root/modules/provider-skeleton/src/main/java/com/ak/iform/skeleton/provider 服务层 java Implement 继承服务接口实现类,且调用领域和仓库层的编写业务代码
  • 跨服务之间调用彼此接口,只能依赖接口层FeignClient,不能依赖其他服务层的biz,model,domain,repository.

资源层

简述:资源层在代码中主要由SQL Map XML映射文件、缓存、文件存储组成。以骨架项目下的代码:
iform-skeleton-root/modules/skeleton-model-root/modules/skeleton-model为例,存储对应的实体对象和mybatisd的xml代码。

服务层

简述:将Dao层、QueryDao层、Domain层、Repository层、controller(继承api\FeignClient)存放此处,
对应传统的四层中Dao层(拆分为Dao和queryDao),service层(拆分为Domain和Repository)将读取数据抽离一层,实现六层的DDD领域驱动架构.

服务层中的Dao和QueryDao

各个模块的Dao和QueryDao文件都在其对应模块biz文件中。下面以骨架项目iform-skeleton-root/modules/skeleton-biz-root/modules/skeleton-biz为例。

  • 注意
    (1)在Dao中可以做增、删、改的业务代码。
    (2)在QueryDao中只做查询,不做增、删、改的业务代码。
    (3)QueryDao和Dao实现类都需要重写命名空间方法,返回对应PO类的名称。
    (4)操作时调用抽象类的方法,注意格式。

服务层中的Domain和Repository

与服务层中的Dao和QueryDao同个工程目录下,该模块需要与Dao层存放一起,还是以骨架项目:
iform-skeleton-root/modules/skeleton-biz-root/modules/skeleton-biz为例。。

图中红框为Domain、Repository及其实现类。Domain和Repository分别继承对应的抽象领域驱动类(AbstractDomain)和抽象仓库(IRepository)即可。

Domain(领域驱动类)和Repository(查询仓库类)的使用:
(1)重写方法。部分方法按照项目需求重写,比如getInternalCacheName(),不需要设置缓存的数据请不要重写。
(2)Domain内进行数据的增删改,具体的数据处理可以在此处完成。在数据操作过程中,可以引入Repository或QueryDao进行必要的查询,也可以引入Service调用其他服务。Repository查询同理。

(3)为了性能或日志等功能的拓展,建议使用继承的抽象的create(P p)等方法实现数据的增删改。想实现各操作的前后置操作,请重写对应的方法。

RestController(对应传统的controller层)

各个模块的Provider文件都在其对应模块provide-xxxx的provider文件中,provider对应的service(api)在provide-xxxx-api中。下面以骨架项目:
iform-skeleton-root/modules/skeleton-provider-base-root/modules/provider-skeleton-api为例。

实现接口的类,文件路径在:iform-skeleton-root/modules/skeleton-provider-root/modules/provider-skeleton/src/main/java/com/ak/iform/skeleton/provider,下面以骨架项目为例:

图中红框为骨架服务的provider。主要的服务接口实现在此处,继承通用服务(GenericProvider)。引入Domain和Repository完成相应的数据操作。

FeignClient

各模块的服务间相互调用是通过FeignClient实现,即跨服务调用接口均通过client(各个模块都带client文件名)实现服务间的相互调用,以项目骨架:
iform-skeleton-root/modules/skeleton-provider-base-root/modules/provider-skeleton-client为例。

注意类中的注解代码,如下图:

- 使用建议:
RestController(Provider)(对应传统的controller层):
(1)建议使用统一响应对象(APIResult)返回数据。
(2)使用@ApiOperation等注解,添加注释。
(3)注意事务控制

service的使用建议:
(1)指定映射的URL、设置请求方法等等。
(2)注意使用校验注解。
作者:caoyl  创建时间:2024-02-29 16:19
最后编辑:黄春艳  更新时间:2024-11-25 19:17