DDD工程落地辅助

架构选择

COLA框架,搭建分层模型

核心思路

业务内聚,分而治之
APP层可先厚,再做薄

领域层抽象

1)实体
唯一标识,具备生命周期,包含业务关键行为
包含实体相关的方法,实体对象可以包含接口(接口可注入),实体建议使用工厂模式创建

2)值对象
只关系属性,没生命周期。
避免大量对象为实体,从而需要唯一标识,唯一标识会带来数据库主键之间关系网庞大。

3)领域服务
属于领域业务,但非实体对象本身的逻辑。
多领域对象计算,业务动作,领域对象转换等均可定义为领域服务。

4)聚合
将实体和值对象进行聚合
形成业务内聚。

聚合根设计

如何聚合根:
1)生命周期一致
2)问题域一致性
3)场景频率一致性
4)聚合内的元素尽可能少

控制边界

如何割断值对象
1)引入Id值对象
2)使用ORM框架的LazyFetch机制(注意生命周期范围)
3)引入Supplier的get延迟机制

实体和值对象的创建,查询

实体的创建最好走工厂模式/builder模式

实体的变更需要走唯一gateway/Repository模式

实体的查询走CQRS模式,注重效率即可

值对象的变更,查询随意,不受约束。

实体对象的持久化

使用mongodb文档型数据库
使用聚合根快照概念
https://github.com/meixuesong/aggregate-persistence

关系数据库,实体持久化可以灵活,一个实体多表(值对象占表),或者一实体一表

各层对象转换

利用 mapstruct

参考

https://blog.csdn.net/significantfrank/ COLA框架
https://developer.aliyun.com/article/713097?spm=a2c6h.13262185.profile.12.1ea36c7btzXxqf DDD落地
https://zhuanlan.zhihu.com/p/436465508 DDD落地
https://blog.csdn.net/qq_33589510/category_10734882.html DDD系列

https://blog.csdn.net/qq_42046105/article/details/125013100?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-125013100-blog-120566859.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-125013100-blog-120566859.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=1

https://mp.weixin.qq.com/s?__biz=MzIzOTU0NTQ0MA==&mid=2247503833&idx=1&sn=d103844943ef2ce81eadd77664a6ac84&chksm=e92af2d6de5d7bc072a16f04d2eb15afd9f3d9d085818901345901bc6f67841747071c78889e&mpshare=1&scene=1&srcid=1117apoiUxlPQGYsMhAjB3L6&sharer_sharetime=1637114884293&sharer_shareid=21878bc7924c790b0c0f03ef06b36d15&key=bcca9004de07f2d9ea0029f6d4fd7e4e2cd15ecfca135628ce2815e910f6e0e5c815a0d2c05d4448da0f537d30c3f741e07d4bb0c2bc020274fe69689036c678b1a67c3c8c00da2342d4df4d835ef555c43129ef4d3c62deffce7fed0460cbd6b08f60f16155a9d9fe369415441773ddeca39927a93a1202ee64380edca719b2&ascene=1&uin=OTM4NTY4MzU%3D&devicetype=Windows+10&version=62060844&lang=zh_CN&exportkey=Abg59yCBS4dVa7lUHHEySnQ%3D&pass_ticket=mxk%2FEa9Sff76MaFalsSx5JYeiSimROUbxBnC7%2FOvQGvs6cXCIB%2B9jRjSm5%2B70Biz&wx_header=0 ##