配置和约定
大约 2 分钟指南配置和约定开发规范CQE
本框架在settings.gradle
中配置了quan-tools、quan-app自动查找模块,若需要在该模块中扩展,只需要直接添加目录即可。
开发约定
应用模块规范
在应用服务模块中,所有的子模块中均要求按照业务模块方式建立目录。因为每个业务模块均可单独抽离并扩展成一个独立的模块,模块之间不可直接依赖调用。 若模块与模块之间强耦合,需要评估是否合并成一个模块;或者只能使用远程服务调用方式。
目录结构例子
.
├── 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接口对数据的要求。