Skip to content

领域驱动设计

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.sqlsqlc.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 的实现思路,在前后端均可实现,写出更易于维护的代码。

参考

访问量 PV:Blocked用户数 UV:Blocked