DDD领域驱动设计-案例-源码说明-Ⅴ
- 该源码为实际项目的脱敏版本,改造过程中,部分功能无法重现。由于售后涉及到订单服务,用户服务等这种跨系统的交互,在案例中基于防腐层做模拟实现。
- 案例的主要目是展示DDD应用传统项目的流程,具体实现功能的代码不是重点关注的对象,读者可主要了解业务流程,业务规则在分层目录中的实现。切不可对流程中的细节功能做过多分析。
- 构建实体与需求文档相对应,构建实体的合理性不在本例中过多讨论,本例前提是已经确定实体,聚合根后,具体编码落地的细节展示。
- 源码中所有实体(包括聚合根)均继承BaseEntity,实体的唯一主键均继承自BaseID。BaseEntity,BaseID是一个只包括uuid的基础值对像。
- 源码中所有的仓库层均继承BaseRepository接口,便于统一定义仓库的通用操作,如实体的保存,查询,移除(设置基础对象,基础接口,有助于统一管理实体和扩展实体的功能)。参考代码如下:

/** * 基础仓库接口 * 仓库的一些通用操作 * * @author wl * @date 2021-9-27 */ public interface BaseRepository<T extends BaseEntity, ID extends BaseID> { /** * 保存实体 * * @param t 实体 * @return 数据字典 */ default T save(T t) { return t; } /** * 查询实体 * * @param keyId 查询主键 * @return 返回实体 */ default T find(ID keyId) { return null; } /** * 删除实体 * * @param keyId 查询主键 */ default void remove(ID keyId) { } }
- 本例采用SpringBoot构建一个微服务,依赖请参考pom.xml文件。
- 本例使用了数据库(mysql),相关的数据脚本,请在资源文件中查看,路径为:resources/static/demosql。
- 先在本地或服务器上面构建好数据库,导入数据表脚本。
- 修改application.properties,数据库的连接地址请修改为本地可连接的配置地址。
- 启动或调试DDDApplication.java,项目启动成功后,才可以测试整个流程。启动成功如图:
- 本例所用的订单信息,是虚拟设置的一个(在源码中可修改订单信息)。且只能基于这个订单号做售后补偿业务测试。
- 为了便于理解,请查看com.wangling.base.tool.ddd.compensate.CompensateControllerTest.java文件,作者编写了测试用例,读者可基于测试用例一步一步的测试或查看代码。
- 创建补偿单过程源码参考:
@Override public long save(CompensateApplyCommand compensateApplyCommand) { // 应用层体现 业务流程: // 获取订单信息-基于防腐层获取 OrderV orderV = compensateSelectFacade.getOrderResponse(compensateApplyCommand.getCompensateBillCommand().getSubOid()); // 获取人员信息-基于防腐层获取 UserResponse userResponse = compensateSelectFacade.getUserResponse(compensateApplyCommand.getCompensateBillCommand().getActuid()); // 基于工厂创建实体 CompensateBillA compensateBillA = compensateBillFactory.createCompensateBillA(compensateApplyCommand, orderV, userResponse); // 调用领域层处理保存的业务逻辑 CompensateBillA compensateBillAdd = compensateBillA.process(compensateBillDomainService); // 调用仓库保存数据 compensateBillRepository.save(compensateBillAdd); // 保存完成后,消息通知其他系统 sendCreateMessage(compensateBillAdd); // 保存完成后,主动发起审核 long coid = compensateBillAdd.getCompensateBillId().getCoid(); check(CheckTypeEnum.AUTO_CHECK, coid, compensateBillAdd.getActuid()); return coid; }
喜欢请赞赏一下啦^_^
微信赞赏
支付宝赞赏
分类:
框架知识
标签:
DDD 领域驱动设计
, DDD
作者:@wuya11
本文为作者原创,转载请注明出处:https://www.cnblogs.com/wlandwl/p/ddd_five.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
限于本人有限的知识水平,文中可能存在误解或错误(轻喷~),欢迎指出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?