要做一个关于DDD的内部技术分享,记录下用到的资源,学习笔记(未完)
最后更新于2023年3月10日 14:28:08
问题建模=》软件分层=》具体结构,是层层递进的关系。有了问题建模,才能进行具体的软件分层的讨论,再有了分层,才能讨论在domain里面应该怎么实现具体结构。
1、问题建模:Domain、Model、Domain Model
领域驱动设计中的领域模型是什么? 这里面说的挺对的,领域模型是处理问题的条理化和结构化的知识,而领域本身就是问题/就是需要解决的业务。对甲方的需求的分析(甲方公司的需求、业务、规则、流程等)组成了domain。
先有了领域模型这个东西,再将领域模型转化为具体的代码,而代码的转化就要分什么用户界面/展现层、应用层、领域层、基础设施层,再往下才是具体的设计,什么实体、值对象之类的。

2、限界上下文
看起来它是对前一小节完成的领域建模的一个划分。
3、软件分层:User Interface、Application、Domain、Infrastructure关注点分离,构造四个概念层
DDD 架構: 分層式架構與依賴反向原則 这个博主讲话真的有够机车的喔!他这个也是稍稍深了一点。
DDD架构的重心是围绕Domain层进行构建的
6. Domain-Driven Design - Layered Architecture 这个挺好的,比较浅。这哥们儿在infrastructure那写的很烂,看得出来是懒得写下去了。写麻了是吧 点开他的个人资料,有一系列文章,应该都不错。
这一层可能是指前端,但是在一些没有前端的程序中,客户指的是外部的其它系统,于是也可以理解为暴露给外部使用的一些API。
这一层还有传统意义上的controller层的功能,即将传入的request转化为应用程序层的方法调用。
“负责为每个服务调用启动事务”是什么勾巴意思?!这里应该跟事务脚本模式有关。
几个栗子先,下面这是一个Application层的函数,从上面的文章里头扒的:
public void cancelOrder(String username, Long orderId) {// Check authorization on accountOrder order = brokerageAccountRepository.findOrder(orderId);checkAccountAuthorization(getUser(username),order.getAccount().getId(),BrokerageAccountPermission.Trade);// Cancel orderorder.pendingCancel(orderEventPublisher);exchangeTradingService.cancelOrder(order);
}
这个函数做的事情:输入username和orderId两个值对象,从brokerageAccountRepository这个infrastructure层的对象里identify到唯一的orderDomain=》检查账户的认证状态(这个我也不好说,调用了很多东西,很乱……)=》调用orderDomain来取消订单=》从exchangeTradingService里面取消订单,这个不讨论。
根据上面这个函数,总结两点:1、该应用层的函数通过一个值对象,到infra层去检索一个聚合。2、该应用层的函数还能操作这个检索到的聚合,触发一些domain层的事情,就像上面提到的 order.pendingCancel(orderEventPublisher)
这是DDD的重中之重,这个Domain跟建模时候那个Domain是两码事,这个放在第三小节展开了讲。
4、Domain层
因为Domain层是整个软件设计的核心部分,所以展开单独分配一小节来讨论。
这个写的好:Aggregates & Entities in Domain-Driven Design
举个例子:一个订单purchase order(PO)可能包含多个订单项Line items. 比如说结个婚要包含五金、彩礼、车子、房子啥的,一个道理。 聚合支持更高程度的概念。line items可以单独用,但是没啥意义。而且line items可能粒度太小,太麻烦。

这个我觉得说的挺好,一个PO是由entity和好多value object组成的一个聚合aggregate。这里面,PO这个entity是这个聚合的根。
业务逻辑被绑定在值对象上,而非实体上,实体更多地用来做identify。
一个聚合可能包含多个实体,比如说一个账户聚合可能包含一个账户实体和多个交易实体,通过定义事务边界来涵盖一个客户的存款/取款动作。
identify是啥意思:ChatGPT查了一下,差不多就是说不管实体中的值对象怎么变化,实体的身份不会变。就好像一个客户,包含电子邮箱、资产啥的都会变,但是客户就是客户,不会变成摩托车或者油轮什么的。
我上面划掉的这句话的理解不太对,identify就像一本书的isbn号似的,唯一确定一个实体。
GoogleGroup的一个讨论
实体:域内具有重要意义(例如客户)并且可以随时间变化的唯一对象
值对象:域内的不可变对象,在其属性(例如日期、地址)之外没有任何意义
聚合:通过根对象相互关联的实体或值对象的集合
聚合根:“拥有”聚合并充当聚合内所有修改的网关的实体
What’s the Difference Between an Aggregate and a Bounded Context 这个文章太深了。。。
什么是域逻辑? 这个我也没看明白。。。
5、适用于DDD的设计模式等技术
Event Sourcing Example & Explained in plain English 源码收费,想给他个大逼斗,给我死。
Why Event Sourcing? 这个是有关于一个叫eventuate local的微服务开源框架的,这一篇有点儿用,剩下都是废话;
记录事件,用replay事件的方式去重组实体entity。作为消息的载体,允许services去订阅这些事件。事件存储是事件驱动结构的支柱。
Event Sourcing 这个太早了。05年的,不一定有用。
将应用程序的状态的所有更改都存储为事件序列……前面都是老调重弹;
Structuring the Event Handler Logic(构建事件处理的逻辑)这个没人提到过:事务脚本/域模型是什么勾巴东西?!
事件逆转:把+10美元变成-10美元,感觉这个水ppt挺有用的……
…………………………还有一些奇怪的点,都看完估计我就困了,主要看示例吧。
Event Sourcing in Go 写的不好,都是代码片段,不看了。
6、ES相关的开源package
Benthos
其它
DDD与es之间的联系;
事件溯源与事件驱动之间的区别和关系:
写一个基于我们的新系统的例子;
相关文章:
要做一个关于DDD的内部技术分享,记录下用到的资源,学习笔记(未完)
最后更新于2023年3月10日 14:28:08 问题建模》软件分层》具体结构,是层层递进的关系。有了问题建模,才能进行具体的软件分层的讨论,再有了分层,才能讨论在domain里面应该怎么实现具体结构。 1、问题建模:Domain、Mod…...
KDZD互感器二次负载测试仪
一、概述 电能计量综合误差过大是电能计量中普遍存在的一个关键问题。电压互感器二次回路压降引起的计量误差往往是影响电能计量综合误差的因素。所谓电压互感器二次压降引起的误差,就是指电压互感器二次端子和负载端子之间电压的幅值差相对于二次实际电压的百分数…...
在空投之后,Blur能否颠覆OpenSea的主导地位?
Mar. 2023, Daniel数据源: NFT Aggregators Overview & Aggregator Statistics Overview & Blur Airdrop一年前,通过聚合器进行的NFT交易量开始像滚雪球一样增长,有时甚至超过了直接通过市场平台的交易量。虽然聚合器的使用量从10月到…...
2023年新三板产品及服务研究报告
第一章 概述 全国中小企业股份转让系统(英语:National Equities Exchange and Quotations,缩写NEEQ),简称股转系统,是第三家全国性证券交易场所,因挂牌企业均为高科技企业而不同于原转让系统内…...
张力控制之开环模式
张力控制的相关知识也可以参看专栏的其它文章,链接如下: 张力闭环控制之传感器篇(精密调节气阀应用)_RXXW_Dor的博客-CSDN博客跳舞轮对应张力调节范围,我们可以通过改变气缸的气压方式间接改变,张力跳舞轮在收放卷闭环控制上的详细应用,可以参看下面的文章链接,这里我…...
python的django框架从入门到熟练【保姆式教学】第二篇
在上一篇博客中,我们介绍了Django的基础知识,并创建了一个简单的Web应用程序。在本篇教程中,我们将深入探讨Django的模型层(Model),它是Django应用程序的核心组件之一。 模型层 Django的模型层是一个对象…...
解决win10的过度保护导致文件下载不了程序不能打开运行
win7看来大概是要离我们远去了,虽然我们还能看见她的背影,但大势所趋,我们也只能慢慢的接受win10进入到我们的日常生活。但win10很多时候过度的保护却给我们带来了不便。这里列举两个最常见的问题,当然我这里也给出了解决方案。 文…...
扬帆优配|业务量大突破,这个行业发展明显向好
近期上市的新股,大都在招股阐明书里公布了本年第一季度成绩预告。 我国快递事务量本年已达200亿件 国家邮政局监测数据显现,到3月8日,本年我国快递事务量已到达200.9亿件,比2019年到达200亿件提前了72天,比2022年提前…...
DJ1-4 计算机网络和因特网
目录 一、协议层及其服务模型 ISO/OSI 七层参考模型 TCP/IP 参考模型 1. 网际协议栈(protocol stack) 2. 分层:逻辑通信 3. 协议分层与数据 二、攻击威胁下的网络 1. 植入恶意软件 2. 攻击服务器和网络基础设施 3. 嗅探分组 4. 伪…...
Nginx根据$host及请求的URI规则重定向rewrite
项目背景: 将域名请求从默认的80端口转发到443 ssl。本项目特殊之处是一个端口监听多个域名,某些域名还有跳转到特定的地址。 普通情况: server { listen 80; #默认的80端口,非…...
人工智能实验一:使用搜索算法实现罗马尼亚问题的求解
1.任务描述 本关任务: 了解有信息搜索策略的算法思想;能够运用计算机语言实现搜索算法;应用A*搜索算法解决罗马尼亚问题; 2.相关知识 A*搜索 算法介绍 A*算法常用于 二维地图路径规划,算法所采用的启发式搜索可以…...
Spring Security基础入门
基础概念 什么是认证 认证:用户认证就是判断一个用户的身份身份合法的过程,用户去访问系统资源的时候系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户密码登录&am…...
dnsresolver-limit
文件OperationLimiter.h功能DnsResolver是andnroid中提供DNS能力的小型DNS解析器,limit是其中的一个小模块,支持全局、基于key(UID)的DNS请求限制。DnsResolver是多线程模型,单个DNS请求最多启动3个线程(传统DNS)。在网…...
使用 YoctoProject集成Qt6
By Toradex胡珊逢在嵌入式领域中Qt 作为普遍选择的 UI 方案目前已经发布 Qt6 版本。本文将介绍如何为 Toradex 的计算机模块使用 Yocto Project 将 Qt6 集成到镜像里。首先根据这里的说明,准备好Yocto Project 的编译环境。这里我们选择 Toradex 最新的 Linux BSP V…...
「媒体邀约」如何选择适合的媒体公关,媒体服务供应商
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 每天胡老师也会接到大量关于媒体方面的询问,胡老师也都一一的很耐心的进行了解答,也都很详细的做了媒体规划和媒体传播方案,但有的朋友还是很犹豫&…...
html2canvas和jspdf导出pdf,每个页面模块占一页,在pdf中垂直居中显示
需求:html页面转换pdf,页面有多个模块,页面中有文本、echarts、表格等模块,一个模块占一页,因为模块高度不够,所以需要垂直居中 通过html2canvas和jspdf实现,html2canvas用于将页面元素生成canv…...
数学小课堂:集合论的公理化过程(用构建公理化体系的思路来构建自然数)
文章目录 引言I 数的理论1.1 构建自然数1.2 定义整数/有理数/实数/虚数/复数II 自然数和集合的关系1.3 集合1.2 构建自然数III 线性规划问题(线性代数+最优化)3.1 题目3.2 答案引言 数学是一个公理化的体系,是数学对其它知识体系有启发的地方。 数学的思维方式: 不轻易相信…...
3.10多线程
一.常见锁策略1.悲观锁 vs乐观锁体现在处理锁冲突的态度①悲观锁:预期锁冲突的概率高所以做的工作更多,付出的成本更多,更低效②乐观锁:预期锁冲突的概率低所以做的工作少,付出的成本更低,更搞笑2.读写锁 vs 普通的互斥锁①普通的互斥锁,只有两个操作 加锁和解锁只有两个线程针…...
缓存双写一致性之更新策略探讨
问题由来 数据redis和MySQL都要有一份,如何保证两边的一致性。 如果redis中有数据:需要和数据库中的值相同如果redis中没有数据:数据库中的值是最新值,且准备会写redis 缓存操作分类 自读缓存读写缓存: ࿰…...
scala高级函数快速掌握
scala高级函数一.函数至简原则二.匿名的简化原则三.高阶函数四.柯里化和闭包五.递归六.抽象控制七.惰性加载🔥函数对于scala(函数式编程语言)来说非常重要,大家一定要学明白,加油!!!…...
从零开始使用 Node js 调用 Taotoken 多模型 API 的实践感受
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从零开始使用 Node.js 调用 Taotoken 多模型 API 的实践感受 作为一名 Node.js 后端开发者,我最近在项目中接入了 Taot…...
恶意 Hugging Face 仓库 18 小时登顶热门榜,引发公共 AI 仓库安全担忧
【事件概述】一个伪装成 OpenAI 发布内容的恶意 Hugging Face 仓库,向 Windows 系统投放信息窃取恶意软件。该仓库在 18 小时内登上 Hugging Face 热门排行榜首位,被移除前下载量达 24.4 万次,引发人们对企业从公共仓库获取和验证 AI 模型的新…...
WarcraftHelper:让经典魔兽在现代电脑上重获新生
WarcraftHelper:让经典魔兽在现代电脑上重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还记得那些在网吧通宵对战《魔兽争…...
魔兽争霸3优化指南:5个常见问题与WarcraftHelper解决方案
魔兽争霸3优化指南:5个常见问题与WarcraftHelper解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否在玩《魔兽争霸3》时遇到过…...
VTOL无人机微多普勒特征分析与6G感知技术
1. VTOL无人机微多普勒特征分析的技术背景垂直起降(VTOL)无人机因其独特的飞行能力在军事和民用领域获得广泛应用,但同时也带来了空域管理的新挑战。传统雷达识别方法主要依赖目标的宏观运动特征,难以精确区分VTOL的不同飞行阶段。…...
使用Taotoken后模型API调用的延迟与稳定性观测体验分享
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken后模型API调用的延迟与稳定性观测体验分享 作为一名日常需要与多种大模型API打交道的开发者,模型服务的稳…...
氛围编程实战:用AI工具栈快速构建可部署应用
1. 项目概述:什么是“氛围编程”?如果你对“氛围编程”这个词感到陌生,或者觉得它听起来有点玄乎,那太正常了。我第一次听到时,也以为又是哪个硅谷弄潮儿发明的新潮黑话。但当我真正开始实践,并在几个月内从…...
正点原子 RK3562 Android14 集成 GStreamer 1.24.13(CLI + V4L2 插件)完整移植方案
RK3562 Android 系统中集成 GStreamer CLI V4L2 插件的完整移植方案,重点难点在于:预编译产物整理、Android.bp 自动生成、vendor 路径安装、运行时环境变量注入,以及 Android 动态链接 namespace 限制的排查。 正点原子RK3562J开发板瑞芯微…...
粒子群灰狼优化算法稀疏码设计【附代码】
✨ 长期致力于稀疏码多址接入、星型正交振幅调制、功率不平衡码本、粒子群算法、混合粒子群灰狼优化算法研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1ÿ…...
金融机器学习实战:MlFinLab工具包核心模块解析与应用指南
1. 从零到一:为什么我们需要一个金融机器学习的“瑞士军刀”?如果你和我一样,在量化金融和算法交易这条路上摸爬滚打了好几年,那你一定经历过这样的场景:为了复现一篇顶级期刊论文里的某个特征工程方法,你需…...
