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

news2024/11/26 4:29:12

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

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.coloradmin.cn/o/1097422.html

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

相关文章

【C++】C++11—— 包装器

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C学习 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【C】C11…

虹科 | 解决方案 | 经销商(OEM)方案

针对汽车厂的方案 Pico 科技是PC版示波器的市场先驱:我们屡次获奖的PicoScope示波器被超过20家世界领先的汽车厂选择,用于提高质量和降低成本。PicoScope既是示波器,也是频谱分析仪、NVH分析仪、发动机压缩和蓄电池/起动充电系统检测仪。我们…

ROS opencv 人脸识别

人脸识别需要在输入的图像中确定人脸(如果存在)的位置、大小和姿态,往往用于生物特征识别、视频监听、人机交互等应用中。2001年,Viola和Jones提出了基于Haar特征的级联分类器对象检测算法,并在2002年由Lienhart和Mayd…

主题教育问题清单及整改措施2023年-主题教育对照六个方面个人剖析材料

无论前方路途多么坎坷,都要保持内心的坚定和勇敢。生活中没有什么不可战胜的困难,只有我们是否愿意去面对和克服。要相信自己的能力,相信自己拥有足够的智慧和力量去应对一切挑战 每一次的努力都不会白费,每一次的奋斗都是在为自己…

Web自动化测试进阶:网页中难点之expected_ conditions的应用与原理

前言 expected_conditions是selenium的一个模块,可以对网页上元素进行判断,一般配合WebDriverWait使用。 详细介绍说明 1、title_is,判断当前页面的标题是否等于预期,返回布尔值 也可以使用driver.title打印当前页面的标题 f…

BI零售数据分析方案,看了就想拥有

一份优秀的零售数据分析方案该是什么样的?应该是能将人、货、场、供、财的数据分析清楚、展现清楚,更是要具备极强的灵活自主性,随时按需分析。奥威BI零售数据分析方案就是这样的一份零售BI标准方案。 奥威BI零售数据分析方案 1、预设以人货…

BIM如何通过3D开发工具HOOPS实现WEB轻量化?

随着建筑行业的数字化转型和信息建模技术的不断发展,建筑信息模型(BIM)已经成为设计、建造和管理建筑项目的标准。然而,BIM模型通常包含大量的数据,导致在Web上的传输和查看效率低下。为了解决这一挑战,HOO…

【Java基础面试二】、为什么Java代码可以实现一次编写、到处运行?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:一个Java文件里可以有多…

【广州华锐互动】人体血管器官3D动态展示为医学生提供哪些便利?

人体血管器官3D动态展示是一种采用先进的计算机图形技术和立体成像技术,对人体内部结构和功能进行三维可视化的教学方法。这种教学方式以其独特的优势,正在改变传统的解剖学教学模式,为医学教育带来了革新。 首先,3D动态演示能够提…

openssl 之 RSA加密数据设置OAEP SHA256填充方式

背景 如题 环境 openssl 1.1.1l c centos7.9 代码 /** 思路:填充方式自己写,不需要使用库提供的,然后加密时选择不填充的方式加密 关键代码 */ int padding_result RSA_padding_add_PKCS1_OAEP_mgf1(buf, padding_len, (unsigned char*…

mysql——面试题初体验

查询环境 1、student(学生表) 2、课程表(course) 3、教师表(teacher) 4、成绩表(score) 问题 (1) 查询所有学生的学号、姓名、选课数、总成绩 mysql> select s.s_id as 学号,s.s_name as 姓名 from student as s; ---------------- | 学号 | 姓名…

JWT的无限可能性:它如何在身份验证、单点登录、API安全等领域发挥作用

整理下工作中常用到的加密解密算法 和 使用场景 一、Base64和UrlBase64 二、Md5 salt 二、对称加密 四、非对称加密 这节整理 MD5、MD5salt基本介绍、使用场景及特点,以及java实现机制(文末附代码,需要的自取哈) 二、Md5 salt …

2023_Spark_实验十七:导入招聘大数据(项目)

一、爬虫爬取的招聘网站数据 二、在MySQL中创建空表 SET FOREIGN_KEY_CHECKS0;-- ---------------------------- -- Table structure for jd_jobs -- ---------------------------- DROP TABLE IF EXISTS jd_jobs; CREATE TABLE jd_jobs (job_name text,job_date text,minSale…

【无标题】markdow 模板

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Springboot项目中加载Groovy脚本并调用其内部方代码实现

前言 项目中部署到多个煤矿的上,每一种煤矿的情况都相同,涉及到支架的算法得写好几套,于是想到用脚本实现差异变化多的算法!一开始想到用java调用js脚本去实现,因为这个不需要引入格外的包,js对我来说也没…

【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:为什么Java代码可以实现…

uniapp(uncloud) 使用生态开发接口详情(1简单的创建)

开发接口对比时间: 用java开发接口周期太长, 大概5-6个月左右 用php 开发接口周期同样太长, 大概3-4个月左右 用node.js 开发接口周期相对短一点, 大概1-2个月左右 用uniapp 开发接口, 可以不到 1-2周的时间 这里我使用 uniapp 开发接口, 废话不多说了,直接开干 HBuilder官网(…

头像Css

现有如下的图标,他这外层的白色圆圈是border,你敢信 .top-bar__img {margin: 0 8px 0 5px;padding: 2px;width: 30px;height: 30px;border-radius: 100%;box-sizing: border-box;border: 1px solid #eee;vertical-align: middle; }

《软件方法》2023版第1章(08)使用UML的理由,挑破乱七八糟图的脓包

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.3 UML 1.3.2 使用UML的理由 在开发团队中,不乏刻意排斥UML的人。这些人如果只是不使用UML,改为使用其他标准的图形表示法(如BPMN)&a…

城市综合管廊运维的系统集成方案

摘 要:从网络拓扑结构、开放式实时以太网协议、控制层系统配置方面介绍了综合管廊的系统网络架构设计,分析了无线网络特性,阐述了基于HTML5架构所能实现的功能的初步构想,以便于综合管廊运维人员巡检,确保管廊本体安全…