DDD 领域驱动设计落地实践系列:工程结构分层设计

数据流转


上文中分别说到了领域分层结构以及各个数据对象的不同含义和用途,那么我们接下来就看下各个数据对象在 DDD 的各个领域分层中是怎么进行数据流转的吧。

在用户接口层,它需要接收来自 WEB 端、APP 端以及其他的外部数据请求,并将请求通过 DTO 向应用层进行传递,根据应用层返回的 DTO 数据,再将 DTO 转化为页面需要呈现的 VO 数据,进行最后的页面展示。

当请求到达应用层后,如果需要调用外部服务的接口,那么我们需要通过应用层的防腐层进行调用。那么为什么需要防腐层进行调用而不是直接调用呢?主要的原因就是为了隔离接口数据变化,防止外在服务的数据变化影响应用层的代码,如果真的需要修改那么直接在防腐层中进行修改就好了。

在领域层,我通常使用的是 model,可以理解为业务领域模型,主要包括实体以及值对象。在应用层会将 model 作为参数进行领域层接口的调用完成核心的业务逻辑。在一些其他的书中,很多人喜欢使用 DO 来作为领域层的数据承载对象,但是我个人还是觉得 model 更适合,因为从名称上面更好理解一点,更加直观一点,一看就知道是模型,什么模型,当然是业务的领域模型。

领域层中包含了仓储的接口,具体的实现在基础层中,这是一种依赖倒置的设计方式,实现领域层与基础层的解耦。其他的书中喜欢使用 PO 作为这层的数据载体,我习惯使用 DO。因为 DO 就是数据对象,天然的和数据库应该对应在一起,笔者同样觉得这样更加直观。具体怎么用还是看各位在实际落地使用的时候的习惯吧。

在这里插入图片描述

领域模型与代码模型映射


工程分层

在这里插入图片描述

如上图所示,我们在微服务拆分后,将微服务内部的代码层级主要分为 interfaces、biz、domain 以及 instructure 这四层,分别对应用户接口层、业务层、领域服务层以及基础设施层,注意这里的 biz 层实际就是 application 层,用为笔者觉得 application 层不好理解,而 biz 层更好理解一点,实际他们的功能是一样的,只是为了减低下理解的成本。

interfaces 层:就是用户接口层,这里主要存放一些与前端交互的代码以及与其他服务交互的接口,主要的作用将将前端请求转化为适当数据去调用 biz 层的业务代码进行业务请求,另外将 biz 层返回的数据进行组装最终形成页面所需要的数据。

biz 层:其实就是 application 层,但是我更愿意叫 biz 层,因为这层的作用实际就是进行服务组合以及服务调度的,实际它是基于下层的领域服务去完成业务逻辑流程的,因此我觉得叫 biz 层更加贴切一点。

domain 层:这是整个微服务的核心层,主要包含了领域模型、领域服务以及核心的业务逻辑。领域模型主要包括了聚合中的聚合根、实体以及值对象,领域事件也会放在这一层中。

instructure 层:基础设施层主要包含了各种通用能力以及工具类,它的作用就是为上层提供基础服务的,如数据库服务、MQ 服务以及缓存服务等还有其他的一些配置以及资源。

代码归位

1、interfaces 层

(1)assemble 主要负责实现 vo 与 dto 之间的数据转换工作。

(2)vo 存放需要呈现在页面的视图数据对象。

(3)facade 主要实现本层的接口封装。

在这里插入图片描述

2、biz 层

按照我自己的习惯,笔者是按照互粉的领域来进行包构建的,比如这里的 user 以及 authority 就是不同的领域。为什么这么划分呢?主要考虑到未来万一有新的拆分,我们可以直接按照对应的域进行拆分,效率要比在不同包中一个一个类找相关的高的多。另外按照领域划分也比较清晰。可以方便的熟悉业务。

(1)dto 中主要放了数据传输对象,biz 层接口的入参以及返回值都是 dto。

(2)service 就是 biz 的接口以及接口实现,主要的作用就是实现对于领域服务的编排以及组合,从而完成具体的业务流程。

(3)event 主要放的是事件发布以及订阅的相关代码,实际具体的事件核心逻辑可以放在 domain 层中进行处理。

在这里插入图片描述

3、domain 层

说实话,以前我们经常使用以数据驱动的设计以及开发方式,大部分的业务逻辑都是在 biz 层完成的,但是领域驱动设计和数据驱动设计最大的不同就是,大部分核心的业务逻辑需要下沉到 domain 层中。实际一开始进行这种方式的开发的时候非常的不习惯,但是当你实际沉下心来做的时候会发现,的确这种开发方式更加的能体现 DDD 的优势。另外这里还是根据领域进行划分,和 biz 层是一样的。

(1)event 主要放事件处理的核心逻辑代码。

(2)model 中就是具体的实体。

(3)repo 主要存放持久化的代码。

(4)service 主要存放领域服务的核心业务逻辑代码。

(5)valueobject 主要存放值对象。

在这里插入图片描述

4、instructure 层

这层的话主要存放一些基础中间件的链接配置代码以及 domain 的 repo 实现代码以及其他一些资源类的代码

在这里插入图片描述

总结

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
7652)]

[外链图片转存中…(img-0rtbiNrq-1713318807652)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值