DDD领域驱动的核心概念

概述

领域的范围关系

领域包含限界上下文,限界上下文包含子域,子域包含聚合,聚合包含实体和值对象。
领域-》限界上下文-》子域(微服务)-》聚合-》实体+值对象。

DDD分层架构

用户接口层

用户接口层是前端应用于微服务应用层的桥梁,需要完成DTO到BO、Entity等对象之间的转换。
这里明确了用户接口层的逻辑十分简单,就是一个接收器、转发器,接收用户的请求,简单的CRUD转发到DomainService中,复杂的业务请求转发到Application中。

应用服务层

强调跨聚合服务、跨模块间服务的编排。
一个聚合的应用服务可以建立一个应用服务类,管理聚合所有的应用服务。
由于领域核心逻辑已经很好的沉淀到了领域层中,领域层的这些核心逻辑可以高度复用。应用服务只需要灵活的组合和编排这些不同聚合的领域服务就可以很容易的适配前端业务的变化。因此应用层不会积累太多的业务逻辑代码,所以会变的很薄,代码维护起来也会非常容易。

领域层

基础层

对象的分层和转换

DTO、BO、Entity、VO对象说明。

  • DTO:用在用户接口层,接收、响应用户请求。
  • BO:聚合根(业务对象模型),用在domain层、application层,表达业务涉及思想,抽象业务模型;本身会聚合多个Entity、VO对象。
  • Entity:数据表映射对象,用在domain层、application层,用于表示数据表的模型。
  • VO:值对象,用在domain层、application层,是对Entity对象的补充,用于值传递,和Entity对象一起服务于BO,方便业务模型的表达。
    用户接口层通过DTO接收、响应用户,同时使用assembler装配转换成Entity/BO对象到application或者领域层。
    Entity对象和BO对象之间的转换,转换可以放在domain的factory层也可以放在Entity或者BO对象上。

聚合相关概念

聚合的管理

包括聚合根、实体和值对象的关系。
实践中聚合根使用xxBO,实体使用xxxEntity,值对象使用xxxVO;
BO与Entity不是完全的充血模型(只实现简单的本实体内的行为),涉及的到数据库交互,复杂的跨多实体的业务逻辑是放到DomainService中的;
service原则上只处理本聚合内的业务(符合高内聚低耦合的原则),多聚合服务的编排放在application层中。

聚合数据的初始化和持久化

按照DDD的建议是通过仓储模式,domain中实现repository的接口,infrastructure中实现数据库的持久化,符合依赖导致原则。
但是实践中发现这样虽然解耦了,但是流程太繁琐,通常的微服务持久化只有一种或者两种方式, 没必要使用这么繁琐的流程。
实践中采用service中调用infrastructure中的mapper接口直接完成数据的持久化,简洁明了。

聚合的解耦

聚合的解耦主要体现在跨聚合的服务调用上,三层架构是service直接调用其他聚合的服务,这里我们建议放在application层进行聚合间微服务编排,主要目标是为了方便后期不同的聚合拆分成多个微服务是代码容易拆分。

领域服务

领域服务、聚合根、实体提供的服务尽量原子化,这样应用层编排起来比较方便,也不会出现很多容易代码。
一个聚合可以设计一个领域服务类,管理聚合内索引的领域服务。
如果一个业务行为由多个实体对象参与完成,就将这部分业务逻辑放在领域服务中,可以理解为领域服务是对聚合内不同实体服务的编排。
领域服务与实体方法的区别是:

  • 实体方法完成单一实体自身的业务逻辑,是相对简单的原子业务逻辑;
  • 领域服务则是多个实体组合出的相对复杂的业务逻辑。
    注意事项:
    在领域服务或实体方法中,我们尽量避免调用其他聚合的领域服务或引用其他聚合的实体或值对象,这种操作会增加聚合的耦合度。在微服务架构演进时,如果出现聚合拆分和重组,这种跨聚合的服务调用和对象调用,会变成跨微服务的操作,导致这种跨聚合的领域服务调用和对象引用失效,在聚合拆分是会增加代码解耦和重构的工作量。

领域事件

事件实体
通常我们可以把实体拆分成基类Event和领域Event。
事件的执行逻辑
1.执行业务逻辑;
2.完成业务数据持久化;
3.完成事件数据持久化(可选);
这一步可选的原因是,如果后期不需要进行对账、重发等确认操作可以无需事件记录持久化。
4.完成领域事件发布;

工厂模式

对于大型的复杂领域模型,聚合内的聚合根、实体、值对象直接的依赖关系比较复杂,这种过于复杂的依赖关系,不适合通过根实体构造器来创建。为了协调这种复杂的领域对象的创建和生命周期管理,在DDD里引入了工厂模式,在工厂里封装复杂的对象创建过程。

解耦

由于架构的演进,微服务与生俱来就需要考虑聚合的未来重组。因此微服务的设计和开发要做到未雨绸缪,而这最关键的就是解耦。
聚合于聚合的解耦
当多个聚合在同一个微服务时,很多传统架构开发人员会下意识地引用其他聚合的实体和值对象,或者调用其它聚合的领域服务。因为这些聚合的代码在同一个微服务内,运行时不会有问题,开发效率似乎也更高,但这样会不自觉地增加聚合之间的耦合。在微服务架构演进时,如果聚合被分别拆分到不同的微服务中,原来微服务内的关系就会变成跨微服务的关系,原来微服务内的对象引用或服务调用将会失效。最终你还是免不了要花大量的精力去做聚合解耦。虽然前期领域建模和边界划分得很好,但可能会因为开发稍不注意,而导致解耦工作前功尽弃。
微服务内各层的解耦
微服务内有四层,在应用层和领域层组成核心业务领域的两端,有个缓冲区或数据转换区。前端与应用层通过组装器实现 DTO 和 BO、Entity的转换,这种适配方式可以更容易地响应前端需求的变化,隐藏核心业务逻辑的实现,保证核心业务逻辑的稳定,实现核心业务逻辑与前端应用的解耦。

总结

DDD是一套方法论,目的是为了方便我们业务建模,代码解耦,不要被其中的相关概念束缚住。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac: docker安装及其Command not found: docker

已经安装了docker desktop,没安装的 点击安装 傻瓜式安装即可 接着打开终端:好一个 Comand not found:docker 看我不把你整顿,解决如下: 如果你在 macOS 上安装了 Docker Desktop,但是终端无法识别 docker 命令&…

微信搜一搜优化:今天你“搜一搜”了吗?

微信“搜一搜”功能的排名规则和机制是微信生态系统中非常重要的一部分,它决定了小程序、公众号、文章、直播等内容在搜索结果中的展示顺序。小柚给大家整理了一份对其排名规则和机制的详细解析: 首先,关键词匹配度是影响搜索结果排名的重要…

HashMap底层实现条分缕析

目录 题外话 正题 哈希表 哈希碰撞 HashMap底层实现 小结 题外话 又水了两天,怪我,在宿舍确实没什么状态,是时候调整调整了 正题 今天直接讲解HashMap底层实现 哈希表 哈希表又称散列表 是数组和单向链表的结合体 如下图 而哈希表存放元素机制是靠哈希函数解析关键…

【问题解决】DDP | 如何使用 DDP 模式来训练模型

在训练 pytorch 模型时,多卡并行训练能够很大程度上提升模型的训练效率 一般来说,有两种多卡并行的训练方式:DP 和 DDP 一、DP 和 DDP 的区别 DP(Data Parallelism)和DDP(Distributed Data Parallelism&…

Jira搭建过程

看到很多小伙伴对jira有兴趣,我们今天就来分享一下jira的搭建吧 首先要明白jira是什么? 看来搭建jira也是我们测试人员需要具备的技能之一了.下面是详细的大家步骤: 1.系统环境准备 Centos 7.5 Mysql 5.6 Java1.8 2.软件安装包 atlassian-jira-software-7.13.0-x64.bin …

【Android 实现AES-CMAC加密】

1. 概述 CMAC(Cipher Block Chaining-Message Authentication Code),也简称为CBC_MAC,它是一种基于对称秘钥分组加密算法的消息认证码。由于其是基于“对称秘钥分组算法”的,故可以将其当做是对称算法的一种操作模式。…

Linux_环境变量

目录 1、查询所有环境变量 2、常见的环境变量 2.1 PATH 2.2 HOME 2.3 PWD 3、增加新的环境变量 4、删除环境变量 5、main函数的三个形参 5.1 argv字符串数组 5.2 env字符串数组 6、系统调用接口 6.1 getenv 6.2 putenv 7、全局变量environ 结语 前言&…

SpringBoot + kotlin 协程小记

前言: Kotlin 协程是基于 Coroutine 实现的,其设计目的是简化异步编程。协程提供了一种方式,可以在一个线程上写起来像是在多个线程中执行。 协程的基本概念: 协程是轻量级的,不会创建新的线程。 协程会挂起当前的协…

中颖51芯片学习9. PWM(12bit脉冲宽度调制)

中颖51芯片学习9. PWM(12bit脉冲宽度调制) 一、资源简介二、PWM工作流程三、寄存器介绍1. PWMx控制寄存器PWMxCON2. PWM0周期寄存器PWM0PH/L3. PWM1周期寄存器PWM1PH/L4. PWM0占空比控制寄存器PWM0DH/L5. PWM1占空比控制寄存器 PWM1DH/L6. 占空比寄存器与…

MacOS 12安装V8Js

一、环境 V8引擎(https://github.com/v8/v8)是Google的开源JavaScript引擎,性能很高,NodeJs就是采用了V8引擎。V8的作用就解析、运行JavaScript脚本,可以简单理解为JavaScript的解析器。 V8Js(https://git…

跨语言指令调优深度探索

目录 I. 介绍II. 方法与数据III. 结果与讨论1. 跨语言迁移能力2. 问题的识别3. 提高跨语言表现的可能方向 IV. 结论V. 参考文献 I. 介绍 在大型语言模型的领域,英文数据由于其广泛的可用性和普遍性,经常被用作训练模型的主要语料。尽管这些模型可能在英…

CDN引入Vue3

选择CDN版本 vue.global.prod.js > 在head中使用 引入后&#xff0c;在后续根组件和子组件中可以通过全局的Vue,来引入对应ref、createApp等方法&#xff0c;如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF…

ESLlint重大更新后,使用旧版ESLint搭配Prettier的配置方式

概要 就在前几天&#xff0c;ESLint迎来了一次重大更新&#xff0c;9.0.0版本&#xff0c;根据官方文档介绍&#xff0c;使用新版的先决条件是Node.js版本必须是18.18.0、20.9.0&#xff0c;或者是>21.1.0的版本&#xff0c;新版ESLint将不再直接支持以下旧版配置(非扁平化…

二、OSPF协议基础

基于SPF算法&#xff08;Dijkstra算法&#xff09;的链路状态路由协议OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09; 目录 1.RIP在大型网络中部署所面临的问题 2.Router ID 3.OSPF的报文 4.OSPF邻居建立过程 5.OSPF报文的确认机制…

SAP的生成式AI

这是一篇openSAP中关于SAP生成式AI课程的笔记,原地址https://open.sap.com/courses/genai1/ 文章目录 Unit 1: Approaches to artificial intelligence概念三种范式监督学习非监督学习强化学习Unit 2: Introduction to generative AI生成式AI基础模型关系基础模型有哪些能力呢…

怎么通过isinstance(Obj,Class)验证?【isinstance】

最近有这样一个项目&#xff0c;这个项目可以用一个成熟的项目的构造树&#xff0c;读取树&#xff0c;再检索的过程&#xff0c;现在有新的需求&#xff0c;另一个逻辑构造同样节点结构的树&#xff0c;pickle序列化保存&#xff0c;再使用原来项目的读取、检索函数&#xff0…

线程、线程组、线程池、锁、事务、分布式

1.线程 Thread类 &#xff0c;可以继承他&#xff0c;复写run方法&#xff0c;然后new一个对象&#xff0c;调用start方法启动。 2.runnable接口&#xff0c;他单独把run方法定义出来了&#xff0c;可以自己实现一个runnable接口&#xff0c;然后new一个runnable对象给到threa…

一年期免费SSL证书申请方法

免费SSL证书的申请已经成为当今互联网安全实践中的重要环节&#xff0c;它不仅有助于保护网站数据传输的隐私性和完整性&#xff0c;还能提升用户信任度&#xff0c;因为现代浏览器会明确标识出未使用HTTPS&#xff08;即未部署SSL证书&#xff09;的网站为“不安全”。以下是一…

vue项目的Husky、env、editorconfig、eslintrc、tsconfig.json配置文件小聊

一、Git配置文件 1、Husky Husky 是一款管理 git hooks 的工具&#xff0c;可以帮助我们触发git提交的各个阶段&#xff1a;pre-commit、commit-msg、pre-push&#xff0c; 有助于我们在项目开发中的git规范和团队协作。 .husky文件通常包含以下内容&#xff1a; pre-commi…

互联网安全面临的全新挑战

前言 当前移动互联网安全形势严峻&#xff0c;移动智能终端漏洞居高不下、修复缓慢&#xff0c;移动互联网恶意程序持续增长&#xff0c;同时影响个人和企业安全。与此同时&#xff0c;根据政策形势移动互联网安全监管重心从事前向事中事后转移&#xff0c;需加强网络安全态势感…