跳至主要內容

配置和约定

大约 2 分钟指南配置和约定开发规范CQE

本框架在settings.gradle中配置了quan-tools、quan-app自动查找模块,若需要在该模块中扩展,只需要直接添加目录即可。

开发约定

遵循阿里巴巴Java开发手册open in new window

应用模块规范

在应用服务模块中,所有的子模块中均要求按照业务模块方式建立目录。因为每个业务模块均可单独抽离并扩展成一个独立的模块,模块之间不可直接依赖调用。 若模块与模块之间强耦合,需要评估是否合并成一个模块;或者只能使用远程服务调用方式。

目录结构例子

.
├── quan-app
│   │
│   │ (以下部分为模块创建示例,按照领域模型划分边界。内部可以自由扩展)
│   ├── quan-app-core
│   │   ├── com.quan.app.core
│   │   |   ├── system(模块目录,模块内部按照MVC规范,可以自由扩展)
│   │   |   |   ├── controller
│   │   |   |   ├── service
│   │   |   |   └── feign
│   │   |   └── tools
│   │   |   |   ├── controller
│   │   |   |   ├── service
│   │   |   |   └── feign
│   │   .   .   
│   ├── quan-app-common
│   │   ├── com.quan.app.common.module
│   │   |   ├── system(模块目录,模块内部按照CQE规范命名,可以自由扩展)
│   │   |   └── tools
.   .   .   .

CQE规范

规范: ApplicationService的接口入参只能是一个Command、Query或Event对象,CQE对象需要能代表当前方法的语意。
唯一可以的例外是根据单一ID查询的情况,可以省略掉一个Query对象的创建。
针对于不同语意的指令,要避免CQE对象的复用

CQE描述
Command指令
指调用方明确想让系统操作的指令,其预期是对一个系统有影响,也就是写操作。通常来讲指令需要有一个明确的返回值(如同步的操作结果,或异步的指令已经被接受)。
Query查询指调用方明确想查询的东西,包括查询参数、过滤、分页等条件,其预期是对一个系统的数据完全不影响的,也就是只读操作。
Event事件指一件已经发生过的既有事实,需要系统根据这个事实作出改变或者响应的,通常事件处理都会有一定的写操作。事件处理器不会有返回值。这里需要注意一下的是,Application层的Event概念和Domain层的DomainEvent是类似的概念,但不一定是同一回事,这里的Event更多是外部一种通知机制而已。

提示

一般我们在处理请求参数的时候按照CQE规范;响应参数返回VO或直接返回DTO,这取决于API接口对数据的要求。

上次编辑于:
贡献者: wangquan