DDD之领域(Domain)和子域(Subdomain)

领域驱动设计系列文章,点击上方合集↑

1. 领域

领域(Domain)是一个组织所做的事情以及其中所包含的一切,领域可以表示整个业务系统。

领域,简单来说,是指一个业务或行业领域,例如电商、社交媒体、金融等。在软件开发中,将领域抽象出来,以便更好地理解业务需求,并将其作为设计和实现的核心。领域由一组相关的业务概念、规则、流程和行为组成,它们共同构成了业务领域的核心要素。通过理解和建模领域,我们可以更好地设计出与实际业务需求相符合的软件系统。

2. 子域

在DDD中,一个领域被分为若干子域,领域模型在限界上下文中完成开发。

子域(Subdomain)是领域的一部分,它代表了领域中的一个较小的特定业务领域。在一个大型复杂的领域中,可以将其拆分为多个子域来进行设计和开发。子域通常具有自己独特的业务概念、规则和流程,而且往往有着较高的内聚性,因此可以将其当作一个相对独立的业务模块进行开发。每个子域都有自己的上下文和职责,可以由一个团队或多个团队来负责。

一个简单的电商的例子:

商家向买家展示不同类别的产品,允许买家下单和付款,还需要安排物流。在这个领域中,零售商的领域可以分为4个主要的子域:产品目录(ProductCatalog)、订单(Order)、发票(Invoicing)和物流(Shipping)。

如上我们还加入一个库存(Inventory)系统,还有地图系统支撑子域、算法推荐支撑子域,日志和监控通用子域,认证和授权通用子域。

  • 核心域(Sub Domain):它是一个唯一的、定义明确的领域模型,要对它进行战略投资,并在一个明确的限界上下文中投入大量资源去精心打磨通用语言。它是组织中最重要的项目,因为这将是你与其他竞争者的区别所在。正是因为你的组织无法在所有领域都出类拔萃,所以必须把核心域打造成组织的核心竞争力。做出这样的决定需要对核心域进行深入的学习与理解,而这需要承诺、协作与试验。这是组织最需要在软件中倾斜投资的方向。

  • 支撑子域(Supporting Subdomain):这类建模场景提倡的是“定制开发”,因为找不到现成的解决方案。对它的投入无论如何也达不到与核心域相同的程度。也许会考虑使用外包的方式实现此类限界上下文,以避免因错误地认为其具有战略意义而进行巨额的投资。这类软件模型仍旧非常重要,核心域的成功离不开它。

  • 通用子域(Generic Subdomain):通用子域的解决方案可以采购现成的,也可以采用外包的方式,抑或是由内部团队实现,但我们不用为其分配与核心域同样优质的研发资源,甚至都不如支撑子域。

3. 子域与微服务

子域在领域驱动设计中是对业务领域的逻辑划分,而微服务是一种实现架构上的解决方案,将系统拆分为独立的服务。子域可以指导微服务的划分,并帮助实现系统的松耦合、可扩展的微服务架构。

具体来说,每个子域可以作为一个微服务的边界,该微服务负责实现子域的业务逻辑。每个微服务可以独立开发、部署和扩展,通过接口和交互来实现子域之间的通信和协作(上下文映射)。

上述的电商系统我们就可以创建类似如下的多模块项目:

  • 商品服务(Product Service)
  • 订单服务(Order Service)
  • 发票服务(Invoicing Service)
  • 物流服务(Shipping Service)
  • 库存服务(Inventory Service)
  • 地图服务(Map Service)
  • 推荐服务(Recommendation Service)
  • 日志服务(Logging Service)
  • 监控服务(Monitoring Service)
  • 认证服务(Authentication Service)
  • 授权服务(Authorization Service)

4. 最后

虽然很多开发人员没有专门学习过领域驱动设计(DDD),但是实际上创建项目也是按照上述这么创建的(多模块),实际上我们在开发中应用了领域驱动设计的思想,因为我们使用的微服务架构本质上就是符合领域驱动设计的理念来构建系统。

需要指出的是,微服务架构概念是由Martin Fowler与James Lewis于2014年提出的,而领域驱动设计则早在2004年就由Eric Evans提出。领域驱动设计比微服务架构早了整整10年。在当时,JSP和单体应用架构是主流,但Eric Evans就思考并提出了领域驱动设计的概念。


关注微信公众号:“小虎哥的技术博客”,让我们一起成为更优秀的程序员❤️!

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

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

相关文章

从零开始学习调用百度地图网页API:三、鼠标点击绘图功能

目录 代码功能问题注意addEventListenerplot_line 代码 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta name"viewport" content"initial-scale1.0,…

MySQL 的下载与安装

MySQL 的下载 https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.30-1.el7.x86_64.rpm-bundle.tar 将下载的数据包拉到虚拟机的linux系统的主文件夹下,创建一个MySQL文件存放 安装MySQL 1、解压数据包 tar -xvf mysql-5.7.30-1.el7.x86_64.rpm-bundle.tar -x: 表示解压…

finalshell连接虚拟机中的ubuntu

finalshell下载地址: https://www.finalshell.org/ubuntu设置root密码&#xff1a; sudo passwd rootubuntu关闭防火墙&#xff1a; sudo ufw disable安装ssh # sudo apt update #更新数据(可以不执行) # sudo apt upgrade #更新软件(可以不执行) sudo apt install open…

数据结构 二叉树OJ题

数据结构 二叉树OJ题 文章目录 数据结构 二叉树OJ题1. 检查两颗二叉树是否相同2. 判断树是否为另一个树的子树3. 翻转二叉树4. 平衡二叉树5. 对称二叉树6. 二叉树遍历7. 二叉树层序遍历8. 最近公共祖先9. 二叉树创建字符串10. 非递归方式实现前序遍历11. 非递归方式实现中序遍历…

游戏开发年度报告 | 2023年游戏开发团队最流行的制作和发行的方式

近期&#xff0c;Perforce发布了《2023游戏开发与设计现状报告》。此报告调查了来自全球各地的游戏开发专业人士&#xff0c;了解他们面临的主要开发挑战、使用的工具和流程&#xff0c;以及目前最让他们对这个行业感到兴奋的方面。 龙智作为Perforce授权合作伙伴&#xff0c;将…

wifi指纹室内定位系统 计算机竞赛

简介 今天来介绍一下室内定位相关的原理以及实现方法; WIFI全称WirelessFidelity&#xff0c;在中文里又称作“行动热点”&#xff0c;是Wi-Fi联盟制造商的商标做为产品的品牌认证&#xff0c;是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关&#xff…

接口测试很难?3分钟带你入门接口自动化测试

​1、什么是接口&#xff1f; 接口是连接前台和后台的桥梁&#xff0c;前台通过接口调用后端已完成的功能&#xff0c;而无需关注内部的实现细节。借助于接口&#xff0c;可以实现前后台分离&#xff0c;各自完成开发工作后&#xff0c;进行联调&#xff0c;提高工作效率 2、…

Java中的正则表达式

1、体验正则表达式 import java.util.regex.Matcher; import java.util.regex.Pattern;/*** Description: 体验正则表达式:提取英文单词* Author: yangyongbing* CreateTime: 2023/10/16 08:38* Version: 1.0*/ public class Regexp {public static void main(String[] args)…

NodeMCU ESP8266 基于Arduino IDE的串口图形化调试教程(超详细)

NodeMCU ESP8266 基于Arduino IDE的串口图形化调试教程 文章目录 NodeMCU ESP8266 基于Arduino IDE的串口图形化调试教程前言Serial Plotter测试前期准备打开工具方法 1方法 2 测试代码 总结 前言 在嵌入式的开发过程中&#xff0c;我们经常会采集一些传感器的数据&#xff0c…

数据结构 - 5(二叉树7000字详解)

一&#xff1a;二叉树的基本概念 1.1树形结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 注意&am…

js继承的几种方式(原型链继承、构造函数继承、组合式继承、寄生组合式继承、ES6的Class类继承)

1.原型链继承 实现原理&#xff1a;子类的原型指向父类实例。子类在自身实例上找不到属性和方法时去它父类实例&#xff08;父类实例和实例的原型对象&#xff09;上查找&#xff0c;从而实现对父类属性和方法的继承 缺点&#xff1a; 子类创建时不能传参&#xff08;即没有…

scrollIntoView使用与属性详解

scrollIntoView 使用与属性详解 效果图如下图所示 如果要想让元素滚动到指定位置 window.onload function () {containerItems[6].scrollIntoView({ behavior: "smooth" }); };js 代码 const containerItems document.querySelectorAll(".container div&…

2 files found with path ‘lib/armeabi-v7a/liblog.so‘ from inputs:

下图两个子模块都用CMakeLists.txt引用了android的log库&#xff0c;编译后&#xff0c;在它们的build目录下都有liblog.so的文件。 四个CPU架构的文件夹下都有。 上层模块app不能决定使用哪一个&#xff0c;因此似乎做了合并&#xff0c;路径就是报错里的哪个路径&#xff0c…

【算法训练-排序算法 一】【手撕排序】快速排序、堆排序、归并排序

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【手撕排序系列】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

UPS监控技术,你一定要试试,太绝了!

UPS&#xff08;不间断电源&#xff09;监控系统是一种关键的技术&#xff0c;用于监视、管理和维护不间断电源设备&#xff0c;以确保电力供应的稳定性和可用性。这对于各种组织和企业来说至关重要&#xff0c;因为电力中断可能导致生产中断、数据丢失和设备损坏&#xff0c;对…

全流量安全分析发现内部系统外联异常

内部系统外连监控的重要性在于保护企业的信息安全和预防数据泄露&#xff0c;以下是几个重要的理由&#xff1a; 1、检测异常活动&#xff1a;通过监控内部系统的外连连接&#xff0c;可以及时发现是否有未经授权或异常的链接尝试。这可能表示存在恶意软件、黑客攻击或内部员工…

MySQL JSON_TABLE() 函数

JSON_TABLE()函数从一个指定的JSON文档中提取数据并返回一个具有指定列的关系表。 应用&#xff1a;数据库字段以JSON 存储后&#xff0c;实际应用需要对其中一个字段进行查询 语法 JSON_TABLE(json,path COLUMNS(column[,column[,...]]))column:name参数 json必需的。一个 …

使用Python创建faker实例生成csv大数据测试文件并导入Hive数仓

文章目录 一、Python生成数据1.1 代码说明1.2 代码参考 二、数据迁移2.1 从本机上传至服务器2.2 检查源数据格式2.3 检查大小并上传至HDFS 三、beeline建表3.1 创建测试表并导入测试数据3.2 建表显示内容 四、csv文件首行列名的处理4.1 创建新的表4.2 将旧表过滤首行插入新表 一…

docker部署的jenkins配置(接口自动化)

目录 一、jenkins汉化1.点击Manage Jenkins&#xff08;系统管理&#xff09;&#xff0c;点击Plugins&#xff08;插件&#xff09;2.安装Locale插件 二、jenkins配置allure报告1.安装allure插件2.配置 三、配置jenkins项目1.新建任务2.创建项目3.源码管理4.构建触发器5.增加构…

12个VIM编辑器的高级玩法

vim 是一个很好用的编辑器&#xff0c;应用十分广泛。但关于 vim&#xff0c;总有一些你不知道的事情&#xff0c;我们需要持续不断的学习。 我经常使用 vim&#xff0c;也经常在各大社区、论坛看到 vim 专家用户分享经验&#xff0c;今天我们就总结其中常用的一部分&#xff…