Appearance
领域驱动设计
why
- 代码解耦,减少导入多余依赖,减少循环依赖
- 更好地实现数据驱动,先数据后视图。数据视图协作过程中减少多 model 相互依赖痛点。
- 增加可测试性
how
DDD 领域驱动设计,采用分层架构提升代码的高内聚低耦合、可扩展、可测试性。
○ DDD 实现思路
- 表示层 Presentation:展示界面,响应交互
- 应用层 Application:处理交互,协调调用多个领域服务完成业务逻辑。可和领域聚合根重叠。可读写分离。
- 领域层 Domain:封装核心业务逻辑,提供领域模型。实体是动态对象。值对象是不可变对象。聚合根封装一系列修改、读取实体、值对象等事务。
- 基础设施层 Infrastructure:底层公共能力,如:api 请求、消息传递等。
○ 前端实践
- 表示层:
page/
目录,存放页面组件;domain/<area>/<component>
存放局部组件。 - 应用层:页面组件和局部组件中,接收用户交互事件。
- 领域层:
domain/<area>/
文件夹中,拆分type.ts
类型、constant.ts
常量(值对象)、xx.model.ts
领域对象/聚合根。允许多聚合根! - 基础设施层:
domain/<area>/
文件夹中,拆分xx.http.ts
接口、xx.util.ts
工具函数。
txt
page
page1
page2
domain
table
type.ts
constant.ts
table-column-builder.ts -> 也属于 xx.model.ts
○ 后端 Go 实践
- 表示层:
route/
文件夹中,接收请求,返回响应 - 应用层:
domain/
文件夹中(共用一个文件夹,对应一个 package,避免 package 起名痛苦),<area>.reader.go
读取聚合根,<area>.writer.go
写入聚合根 - 领域层:
domain/
文件夹中,存放<area>.constant.go
常量、<area>.<struct>.go
领域对象/聚合跟 - 基础设施层:
sql/
文件夹中,存放<area>_read.sql
、<area>_write.sql
,和共用的schema.sql
、sqlc.yaml
。sqlc 生成的接口存放到api/
文件夹中。
txt
route
user.go
domain
user.constant.go
user.util.go -> 也属于 <area>.<struct>.go
sql
schema.sql -> 所有表的表结构
sqlc.yaml -> sqlc 配置
user_read.sql
user_write.sql
dl -> sqlc 自动生成,只读
db.go
models.go
what
通过 DDD 的实现思路,在前后端均可实现,写出更易于维护的代码。