大话DDD — 传统MVC思想转变为与DDD的思维

2022-05-25  本文已影响0人  小胖学编程

1. DDD的架构

image.png

1. 用户接口层(Controller层)

用户接口层负责向用户显示信息和解释用户指令。

2. 应用层(Service层)

应用层是很薄的一层,理论上不应该由业务规则或逻辑,主要面向用例和流程相关的操作。也可以完成

应用服务是在应用层的,它负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果的拼装,以粗粒度的服务通过 API 网关向前端发布。还有,应用服务还可以进行安全认证、权限校验、事务控制、发送或订阅领域事件等。

3. 领域层(domain层)

领域层的作用是实现企业核心业务逻辑,通过各种校验手段保证业务的正确性。领域层主要体现领域模型的业务能力,它用来表达业务概念,业务状态和业务规则;

领域层包含聚合根,实体,值对象。领域服务等领域模型中的领域对象;

领域模型的业务逻辑主要是由实体和领域服务来实现的:

4. 基础层(Repository)

基础层是贯穿所有层的,它的作用就是为其它各层提供通用的技术和基础服务,包括第三方工具、驱动、消息中间件、网关、文件、缓存以及数据库等。比较常见的功能还是提供数据库持久化。

基础层包含基础服务,它采用依赖倒置设计,封装基础资源服务,实现应用层、领域层与基础层的解耦,降低外部资源变化对应用的影响。

  1. 比如说,在传统架构设计中,由于上层应用对数据库的强耦合,很多公司在架构演进中最担忧的可能就是换数据库了,因为一旦更换数据库,就可能需要重写大部分的代码,这对应用来说是致命的。那采用依赖倒置的设计以后,应用层就可以通过解耦来保持独立的核心业务逻辑。当数据库变更时,我们只需要更换数据库基础服务就可以了,这样就将资源变更对应用的影响降到了最低。

2. 传统架构迁移到DDD架构

传统企业应用大多是单体架构,而单体架构大多是三层架构。。三层架构解决了程序内代码间调用复杂、代码职责不清的问题,但这种分层是逻辑概念,在物理上它是中心化的集中式架构,并不适合分布式微服务架构。

DDD 分层架构中的要素其实和三层架构类似,只是在 DDD 分层架构中,这些要素被重新归类,重新划分了层,确定了层与层之间的交互规则和职责边界。

架构迁移.png

仓储又分为两部分:仓储接口和仓储实现。仓储接口放在领域层中,仓储实现放在基础层。原来三层架构通用的第三方工具包、驱动、Common、Utility、Config 等通用的公共的资源类统一放到了基础层。

项目级微服务.png

项目级微服务的内部遵循分层架构模型就可以了。领域模型的核心逻辑在领域层实现,服务的组合和编排在应用层实现,通过 API 网关为前台应用提供服务,实现前后端分离。但项目级的微服务可能会调用其它微服务,你看在下面这张图中,比如某个项目级微服务 B 调用认证微服务 A,完成登录和权限认证。

通常项目级微服务之间的集成,发生在微服务的应用层,由应用服务调用其它微服务发布在 API 网关上的应用服务。你看下图中微服务 B 中红色框内的应用服务 B,它除了可以组合和编排自己的领域服务外,还可以组合和编排外部微服务的应用服务。它只要将编排后的服务发布到 API 网关供前端调用,这样前端就可以直接访问自己的微服务了。

3. 杂谈

ddd领域驱动设计用人话怎么讲。

别犟,无论是传统mvc的先设计表结构还是ddd的先设计领域层在设计表结构。归根到底最终还是要设计表结构的。只不过ddd一直给人一种感觉设计领域对象图更厉害的样子——“你看我可是画了领域图,可不是er图哟”

那么透过现象看本质,所有业务目的不就是为了curd吗?一般来说数据库会有一张基表,n个辅表。甚至在数据中台,只有一张打平表。那么什么样的数据要抽取成为辅表。什么样的数据配置是表属性?是开发自己定还是根据领域划分定的区别。

一般来说,有些数据会高并发写操作,我们新开一个辅表,有些数据不会变更。我们可能会违反数据库范式将其作为冗余属性配置到表记录中。

那么ddd中领域层就很好解释通,我们将聚合根作为基表,将其他实体看作辅表,将值对象看着表记录的属性。其实就是ddd中实体的变与值对象的不变。分析领域行为的目的其实就是有依据的建立表…不像mvc上来开发根据产品需求自己去建表。

上一篇下一篇

猜你喜欢

热点阅读