领域驱动设计(DDD)架构的实践
ddd的成功案例
ddd的成功案例ddd(领域驱动设计)是一种软件开发方法,旨在通过将软件设计与领域知识的理解相结合,提高软件系统的质量和可维护性。
下面是一些成功的ddd案例,它们展示了ddd如何在不同领域中取得成功。
1. 电商平台订单管理系统在一个电商平台上,订单管理是至关重要的。
通过使用ddd,开发团队能够更好地理解订单管理的复杂性,并将领域知识转化为清晰的领域模型。
这样,团队能够设计出更稳定、可扩展的订单管理系统,提高平台的用户体验。
2. 银行贷款系统在银行贷款系统中,ddd的应用可以帮助银行更好地理解贷款领域,并将领域知识转化为可执行的业务逻辑。
这样,银行可以更快速地处理贷款申请,提高贷款审核的准确性和效率。
3. 物流管理系统在物流管理系统中,ddd的应用可以帮助物流公司更好地理解物流领域,并设计出更高效的物流管理流程。
通过将领域知识转化为领域模型,物流公司可以更好地优化货物配送路线,提高物流效率,降低运营成本。
4. 医疗信息系统在医疗信息系统中,ddd的应用可以帮助医院更好地理解医疗领域,并设计出更安全、可靠的信息系统。
通过将领域知识转化为领域模型,医院可以更好地管理患者信息、医疗记录等重要数据,提高医疗服务的质量和效率。
5. 保险理赔系统在保险理赔系统中,ddd的应用可以帮助保险公司更好地理解保险领域,并设计出更高效的理赔流程。
通过将领域知识转化为领域模型,保险公司可以更好地处理理赔申请,提高理赔的准确性和效率。
6. 酒店预订系统在酒店预订系统中,ddd的应用可以帮助酒店更好地理解酒店预订领域,并设计出更好用的预订流程。
通过将领域知识转化为领域模型,酒店可以更好地管理房间、预订信息等重要数据,提高预订服务的质量和效率。
7. 餐饮点餐系统在餐饮点餐系统中,ddd的应用可以帮助餐饮企业更好地理解餐饮领域,并设计出更高效的点餐流程。
通过将领域知识转化为领域模型,餐饮企业可以更好地管理菜品、订单等重要数据,提高点餐服务的质量和效率。
领域设计ddd模型案例
领域设计ddd模型案例领域设计(Domain-driven design,DDD)是一种软件开发方法,它强调将业务逻辑和领域模型作为软件设计的核心。
在DDD中,领域模型是一个反映业务领域的概念模型,它是由领域专家和开发人员共同设计和开发的。
下面是一些符合领域设计DDD模型的案例: 1. 电商平台:电商平台是一个典型的领域设计DDD模型案例。
在这个模型中,领域专家和开发人员共同设计了商品、订单、支付、物流等领域模型,以满足电商平台的业务需求。
2. 医疗系统:医疗系统是另一个典型的领域设计DDD模型案例。
在这个模型中,领域专家和开发人员共同设计了病人、医生、药品、诊断等领域模型,以满足医疗系统的业务需求。
3. 酒店预订系统:酒店预订系统是一个典型的领域设计DDD模型案例。
在这个模型中,领域专家和开发人员共同设计了酒店、客房、预订、支付等领域模型,以满足酒店预订系统的业务需求。
4. 金融系统:金融系统是另一个典型的领域设计DDD模型案例。
在这个模型中,领域专家和开发人员共同设计了账户、交易、风险控制等领域模型,以满足金融系统的业务需求。
5. 物流系统:物流系统是一个典型的领域设计DDD模型案例。
在这个模型中,领域专家和开发人员共同设计了货物、运输、仓储、配送等领域模型,以满足物流系统的业务需求。
6. 人力资源系统:人力资源系统是另一个典型的领域设计DDD模型案例。
在这个模型中,领域专家和开发人员共同设计了员工、招聘、培训、绩效等领域模型,以满足人力资源系统的业务需求。
7. 社交网络:社交网络是一个典型的领域设计DDD模型案例。
在这个模型中,领域专家和开发人员共同设计了用户、好友、消息、动态等领域模型,以满足社交网络的业务需求。
8. 游戏系统:游戏系统是另一个典型的领域设计DDD模型案例。
在这个模型中,领域专家和开发人员共同设计了角色、任务、装备、战斗等领域模型,以满足游戏系统的业务需求。
9. 教育系统:教育系统是一个典型的领域设计DDD模型案例。
ddd分层架构案例
以下是一个使用领域驱动设计(DDD)分层架构的案例:
该案例展示了一个在线购物系统,采用DDD分层架构,将系统划分为多个层次,包括表示层、应用层、领域层和基础设施层。
1.表示层:处理用户界面和用户交互。
在在线购物系统中,表示层负责呈现商品
列表、用户登录表单等界面,接收用户的请求,并将结果显示给用户。
2.应用层:协调业务逻辑的执行。
在在线购物系统中,应用层负责处理用户的请
求,将请求转化为适当的领域操作,并协调领域层的对象进行处理。
例如,当用户提交购物车结算请求时,应用层将请求传递给领域层,由领域层执行业务规则和逻辑处理。
3.领域层:包含系统的核心业务逻辑和领域模型。
在在线购物系统中,领域层包
括商品、订单、用户等实体和仓储、配送等领域的服务。
领域层负责实现业务规则、验证和状态变更等核心领域逻辑。
例如,在用户下订单时,领域层将检查库存量是否充足,执行定价逻辑,并将订单信息存储到数据库中。
4.基础设施层:包括数据访问层、消息传递层、日志记录等。
在在线购物系统中,
基础设施层提供数据存储、消息队列和日志记录等功能。
数据访问层负责与数据库进行交互,实现数据的增删改查操作;消息传递层用于异步处理业务逻辑,例如通过消息队列实现订单状态的变更通知;日志记录用于记录系统运行过程中的重要信息,便于问题排查和监控。
通过使用DDD分层架构,该在线购物系统能够更好地组织和管理业务逻辑和数据,提高系统的可维护性和可扩展性。
同时,各层次之间职责明确,降低了系统的耦合度,方便了开发和维护工作。
软件架构中的领域驱动设计(DDD)
软件架构中的领域驱动设计(DDD)领域驱动设计(DDD)是一种软件开发方法论,它将软件项目的设计和实现过程,建立在对业务领域的深入理解基础之上。
通过将业务领域的知识和经验融入到软件设计和开发的过程中,DDD可以帮助开发团队更好地理解业务需求,提高软件的质量和稳定性。
1. DDD的基本概念领域驱动设计的核心思想是将软件系统划分为不同的领域,每个领域都有自己的业务模型、规则和流程。
通过深入了解这些领域的特点和要求,开发团队可以设计出更加贴合实际需求的软件架构和系统设计。
在领域驱动设计中,通常会使用领域模型、领域事件和领域服务等概念,来帮助团队更好地理解和实现业务需求。
2. DDD的核心概念2.1领域模型领域模型是领域驱动设计的核心概念,它是对领域中各种实体、值对象、聚合和领域服务等概念的抽象和建模。
通过领域模型的建立,开发团队可以更好地理解业务逻辑和规则,从而设计出更加贴合实际需求的软件系统。
领域模型通常是通过领域专家和开发团队的合作来构建的,它是对业务需求的一种抽象和概括。
2.2领域事件领域事件是领域驱动设计中的另一个核心概念,它是描述领域中事件发生和影响的概念。
通过将领域中的各种事件进行抽象和建模,开发团队可以更好地理解各种业务规则和流程,从而设计出更加稳定和可靠的软件系统。
领域事件通常是领域模型的一部分,它描述了业务领域中的各种重要事件和影响。
2.3领域服务领域服务是领域驱动设计中的另一个重要概念,它是对业务领域中某些重要操作和逻辑的抽象和建模。
通过领域服务,开发团队可以更好地处理各种业务逻辑和操作,从而设计出更加灵活和可扩展的软件系统。
领域服务通常是领域模型的一部分,它描述了业务领域中的各种重要操作和逻辑。
3. DDD的应用实践在日常的软件开发过程中,领域驱动设计可以帮助开发团队更好地理解和实现业务需求,提高软件系统的质量和稳定性。
在应用领域驱动设计的实践中,通常会涉及到以下几个方面的工作:3.1领域分析和建模领域分析和建模是领域驱动设计的重要环节,它通过与业务专家的沟通和合作,来深入了解业务领域的特点和要求,从而建立起相应的领域模型、领域事件和领域服务等概念。
DDD领域驱动设计落地实践六步拆解DDD
DDD领域驱动设计落地实践六步拆解DDD 领域驱动设计(Domain-Driven Design,简称DDD)是一种通过深入理解业务领域的核心概念和规则,来影响软件设计的方法。
DDD的目标是将业务专家和技术人员之间的沟通缩小,从而实现更好的软件设计和架构。
在实践DDD时,可以采用以下六个步骤将DDD落地:第一步:理清业务领域首先,需要深入了解业务领域,并与业务专家进行密切合作。
这一步骤的目标是明确业务需求、领域知识、业务规则和相关概念。
可以使用领域建模工具(如UML类图、领域模型)来帮助理清业务领域。
第二步:划分领域在这一步骤中,将业务领域划分为不同的子领域。
子领域应该是有内聚性和自治性的。
通过划分子领域,可以更好地管理和组织复杂的业务。
第三步:确定限界上下文限界上下文是DDD中非常重要的概念,它定义了领域模型的边界和模块的职责。
在这一步骤中,需要明确每个子领域的限界上下文,并确定上下文之间的关系和依赖。
可以使用上下文映射图(Context Map)来帮助可视化上下文之间的关系。
第四步:建立领域模型在这一步骤中,需要根据业务需求和限界上下文,建立领域模型。
领域模型应该是业务专家和技术人员共同理解的模型,可以使用领域特定语言(Domain Specific Language,简称DSL)或UML类图等形式来表示。
第五步:实现领域模型一旦领域模型建立,就可以开始实现领域模型。
可以使用面向对象的编程语言(如Java、C#等)来实现领域模型,并采用DDD中的设计原则和模式(如聚合、实体、值对象、领域服务等)来帮助实现。
第六步:持续演化和迭代DDD是一个持续演化和迭代的过程。
在软件开发过程中,需求和业务规则可能会不断变化,因此领域模型也需要随之演化。
通过与业务专家的紧密合作,及时反馈和迭代,可以不断改进和优化领域模型。
总结起来,实践DDD的六个步骤分别是:理清业务领域、划分领域、确定限界上下文、建立领域模型、实现领域模型以及持续演化和迭代。
《领域驱动设计:业务建模与架构实践》笔记
《领域驱动设计:业务建模与架构实践》阅读笔记目录一、书籍概述 (2)1.1 作者介绍及写作背景 (2)1.2 书籍内容概述 (3)1.3 领域驱动设计的重要性 (5)二、领域驱动设计基础 (6)2.1 领域驱动设计的核心概念 (7)2.1.1 领域模型的定义 (9)2.1.2 泛领域化与领域边界划定 (10)2.1.3 聚合与聚合根的理解 (11)2.2 业务建模方法论 (12)2.2.1 业务需求分析 (14)2.2.2 业务过程建模 (15)2.2.3 业务实体与关系分析 (16)三、领域模型构建实践 (18)3.1 确定业务核心领域与识别关键实体 (20)3.1.1 业务领域识别方法 (21)3.1.2 关键业务实体分析 (22)3.2 构建领域模型的具体步骤 (23)3.2.1 需求分析阶段 (25)3.2.2 概念建模阶段 (26)3.2.3 细化与调整阶段 (27)四、架构实践与应用场景分析 (29)4.1 架构风格选择与设计原则 (30)4.1.1 常见架构风格介绍与选择依据 (32)4.1.2 架构设计原则及最佳实践 (34)4.2 领域驱动设计在典型场景中的应用 (35)4.2.1 订单管理系统实例分析 (37)4.2.2 电商平台的领域驱动设计实践 (39)五、技术实现与工具选择建议 (40)5.1 领域模型的技术实现方式 (42)5.1.1 数据持久层技术选型建议 (44)5.1.2 业务逻辑层的技术实现要点 (45)5.2 辅助工具与最佳实践分享 (46)一、书籍概述《领域驱动设计:业务建模与架构实践》是一本深入探讨软件开发领域中业务建模与架构设计的书籍。
本书作者结合多年的从业经验,为读者提供了一套完整而实用的领域驱动设计(DDD)方法论和实践指南。
在书籍概述部分,作者首先阐述了领域驱动设计的核心理念和目的。
DDD是一种软件开发方法,它强调基于领域模型来构建软件系统,从而更好地理解和表达业务需求。
领域驱动设计 举例
领域驱动设计举例领域驱动设计(Domain Driven Design,简称DDD)是一种软件开发方法论,它将软件系统的设计和开发过程重点放在对业务领域的理解和建模上,通过将业务领域的概念和逻辑与软件系统的设计和实现相结合,以实现高质量的软件系统。
下面是我列举的10个领域驱动设计的例子:1. 电商平台:在电商平台中,可以将商品、订单、用户等业务领域进行建模,通过领域模型来描述和处理各个业务概念之间的关系,如商品可以有多个订单,用户可以下单购买商品等。
2. 酒店管理系统:在酒店管理系统中,可以将客房、预订、入住等业务领域进行建模,通过领域模型来处理客房的可用性、预订的冲突以及入住的时间等业务逻辑。
3. 物流管理系统:在物流管理系统中,可以将货物、运输、配送等业务领域进行建模,通过领域模型来处理货物的运输路线、配送时间以及运输费用等业务逻辑。
4. 医院管理系统:在医院管理系统中,可以将病人、医生、诊断等业务领域进行建模,通过领域模型来处理病人的就诊记录、医生的排班以及诊断结果等业务逻辑。
5. 飞机订票系统:在飞机订票系统中,可以将航班、座位、乘客等业务领域进行建模,通过领域模型来处理航班的起飞时间、座位的可用性以及乘客的订票信息等业务逻辑。
6. 餐厅管理系统:在餐厅管理系统中,可以将菜品、订单、服务员等业务领域进行建模,通过领域模型来处理菜品的制作流程、订单的处理状态以及服务员的工作安排等业务逻辑。
7. 人力资源管理系统:在人力资源管理系统中,可以将员工、部门、薪资等业务领域进行建模,通过领域模型来处理员工的入职离职、部门的调整以及薪资的计算等业务逻辑。
8. 电影票务系统:在电影票务系统中,可以将电影、影院、观众等业务领域进行建模,通过领域模型来处理电影的放映时间、影院的座位安排以及观众的购票信息等业务逻辑。
9. 学生管理系统:在学生管理系统中,可以将学生、课程、成绩等业务领域进行建模,通过领域模型来处理学生的选课、课程的安排以及成绩的录入等业务逻辑。
领域驱动设计业务建模与架构实践
领域驱动设计业务建模与架构实践1.引言领域驱动设计(D oma i n-Dr iv en De si gn,简称D DD)是一种以业务领域为核心的软件设计方法论,通过深入理解业务领域的本质和规则,将业务知识融入软件设计和开发的过程中。
本文旨在介绍领域驱动设计的概念与原则,并探讨在实际项目中如何进行业务建模与架构实践。
2.领域驱动设计概述领域驱动设计是由Er i cE va ns于2004年提出的软件设计方法论,其核心思想是将软件设计的重点从技术转移到业务领域上。
D DD通过与领域专家密切合作,共同理解业务知识和业务需求,并将其转化为可执行的软件模型。
通过将业务领域划分为多个子领域,DD D强调每个子领域的独立性和自治性,从而提高系统的灵活性和可维护性。
3.领域建模领域建模是领域驱动设计中的基础工作,通过对业务领域的分析和理解,建立起业务模型。
领域建模主要包括以下几个步骤:3.1.识别核心领域首先,需要识别出业务系统中的核心领域,即对业务成功至关重要的领域。
通过与领域专家的交流和分析,确定出主要的关键领域,并明确其范围和边界。
3.2.拆分子领域将核心领域进一步拆分为多个子领域。
每个子领域应该具有清晰的边界和自治性,既能够独立于其他子领域进行开发,又能够通过定义好的接口进行交互和合作。
3.3.建立领域模型在每个子领域中,通过领域模型的方式来描述业务中的概念、实体、关系和业务规则等。
领域模型是对业务领域知识的抽象和表达,它能够清晰地反映业务领域的本质和规则。
3.4.持续迭代优化领域建模是一个持续迭代的过程,随着对业务领域理解的不断深入和新需求的出现,需要对领域模型进行不断优化和演化,确保其与业务实际情况的一致性。
4.领域驱动设计架构实践领域驱动设计的架构实践是将领域模型转化为现实的软件架构,以实现系统对业务领域的支持和扩展。
4.1.领域服务通过将业务逻辑封装在领域服务中,我们能够更好地实现业务领域的自治性和独立性。
基于DDD(领域驱动设计)的微服务设计实例
基于DDD(领域驱动设计)的微服务设计实例领域驱动设计(DDD)是一种软件开发方法论,旨在帮助开发人员更好地理解和解决复杂业务领域中的问题。
在微服务架构中,DDD可以帮助我们将系统划分为多个微服务,并以领域为中心进行设计和开发。
本文将介绍一个基于DDD的微服务设计实例。
假设我们正在开发一个在线商城系统,其中包含商品管理、订单管理和用户管理等多个子系统。
我们将以商品管理子系统为例进行详细说明。
1.领域建模首先,我们需要进行领域建模,即识别出商品管理子系统的核心业务概念。
在这个例子中,核心概念可能包括商品、库存、价格等。
我们可以使用领域建模工具(如UML类图)来可视化这些概念之间的关系。
2.聚合根在DDD中,聚合根是一个对象,它是整个聚合(一组相关对象的集合)的入口点。
在商品管理子系统中,商品可以被视为一个聚合根。
商品可以有多个属性,如名称、描述和价格等,同时还有库存和销售记录等相关对象。
3.领域服务领域服务是一种封装了领域逻辑的对象,它可以用于处理复杂的业务操作。
在商品管理子系统中,我们可以定义一个商品服务,用于处理商品的创建、更新和删除等操作。
此外,还可以定义一些其他的领域服务,如库存服务和价格服务,用于处理与商品相关的库存和价格逻辑。
4.值对象值对象是一种没有唯一标识符的对象,其相等性通常是根据其属性值来判断的。
在商品管理子系统中,我们可以定义一些值对象,如商品名称、商品描述和价格等。
这些值对象可以被多个聚合根和实体共享,提高系统的可复用性和灵活性。
5.领域事件领域事件是一种用于表示领域中发生的重要事情的对象。
在商品管理子系统中,我们可以定义一些领域事件,如商品创建事件、商品更新事件和商品删除事件等。
这些事件可以被用于触发其他微服务的操作,如订单服务接收到商品创建事件后,可以根据该事件创建相应的订单。
6.限界上下文限界上下文是一种用于划分系统的边界的模式。
在微服务架构中,每个微服务可以被视为一个限界上下文,它有自己的领域模型和业务规则。
【DDD】领域驱动设计实践——架构风格及架构实例
【DDD】领域驱动设计实践——架构风格及架构实例本⽂是【DDD】系列⽂章中的其中⼀篇,其他可参考:概述DDD为复杂软件的设计提供了指导思想,其将易发⽣变化的业务核⼼域放置在限定上下⽂中,在确保核⼼域⼀致性和内聚性的基础上,DDD可以被多种语⾔和多种技术框架实现,具体的框架实现需要根据实际的业务场景和需求来制定。
核⼼的指导思路归纳为:关注点放在domain上,将业务领域限定在同⼀上下⽂中,识别context bounded降低上下⽂之间的依赖,通过‘开发主机服务’(REST服务是其中的⼀种)、‘消息模式’、‘事件驱动’等架构风格实现遵循分层架构模式架构风格针对DDD的架构设计,《实现领域驱动设计》提到了⼏种架构风格:六边形架构、REST架构、CQRS、事件驱动等。
在实际使⽤中,落地的架构并⾮是纯粹其中的⼀种,⽽很有可能户将上述⼏种架构风格结合起来实现。
此部分内容主要来源于《实现领域驱动设计》的第4章,加上了⾃⼰的⼀些理解。
六边形架构(端⼝和适配器)所谓的六边形架构,其实是分层架构的扩展,原来的分层架构通常是上下分层的,⽐如常见的MVC模式,上层是对外的服务接⼝,下层是对接存储层或者是集成第三⽅服务,中层是业务逻辑层。
我们跳出分层的概念,会发现上⾯层和下⾯层其实都是端⼝+适配器的实现,上⾯层开放http/tcp端⼝,采⽤rest/soap/mq协议等对外提供服务,同时提供对应协议的适配器;下层也是端⼝+适配器,只不过应⽤程序这时候变成了调⽤者,第三⽅服务或者存储层提供端⼝和服务,应⽤程序本⾝实现适配功能。
基于上述思考,将分层接⼝中的上层和下层统⼀起来就变成了六边形架构,基于端⼝和适配器的实现,⽰意图如下:上图来源于《实现领域驱动设计》的P111我认为六边形架构并⾮创造⼀种新的架构风格,只是将原来的分层架构风格重新解读,使得架构更加简洁通⽤。
同时,在DDD的设计思想下,六边形架构风格,让领域模型处于架构的核⼼区域,让开发⼈员将焦点聚集到领域。
java 领域驱动设计ddd 案例
java 领域驱动设计ddd 案例以下是一个简单的Java领域驱动设计(DDD)案例:假设我们要设计一个商品管理系统,其中包括商品和库存两个领域对象。
首先,我们定义一个商品类:```javapublic class Product {private int id;private String name;private double price;public Product(int id, String name, double price) {this.id = id; = name;this.price = price;}// getters and setters}```然后,我们定义一个库存类,用于管理商品的库存数量:```javapublic class Inventory {private Map<Product, Integer> stock;public Inventory() {stock = new HashMap<>();}public void addProduct(Product product, int quantity) {if (stock.containsKey(product)) {int currentQuantity = stock.get(product);stock.put(product, currentQuantity + quantity);} else {stock.put(product, quantity);}}public void removeProduct(Product product, int quantity) {if (stock.containsKey(product)) {int currentQuantity = stock.get(product);if (currentQuantity >= quantity) {stock.put(product, currentQuantity - quantity);} else {throw new IllegalArgumentException("Not enough stock");}} else {throw new NoSuchElementException("Product not found");}}public int getProductQuantity(Product product) {return stock.getOrDefault(product, 0);}}```在这个案例中,商品和库存是两个领域对象,它们的行为和属性分别被封装在各自的类中。
ddd模式工程案例
ddd模式工程案例DDD(领域驱动设计)模式是一种软件设计方法,旨在将业务逻辑和数据模型紧密结合,以便更好地满足业务需求。
下面我将从多个角度为你介绍一些DDD模式的工程案例。
1. 领域模型设计:在DDD模式中,领域模型是核心概念,它描述了业务领域的各个方面以及它们之间的关系。
一个典型的工程案例是电子商务平台的订单管理系统。
在这个系统中,可以使用DDD模式将订单、商品、用户等领域对象进行建模,并定义它们之间的关系和业务逻辑。
2. 聚合根与实体:在DDD模式中,聚合根是一组相关对象的根,它们一起形成一个事务边界。
在一个物流管理系统的工程案例中,可以使用DDD模式将订单作为聚合根,将订单项、配送信息等作为订单的实体,从而实现订单的管理和操作。
3. 领域服务:在某些情况下,业务逻辑可能跨越多个领域对象,这时可以使用领域服务来封装这部分业务逻辑。
例如,在一个酒店预订系统中,可以使用DDD模式将预订服务作为领域服务,处理预订、取消预订等业务逻辑。
4. 领域事件:DDD模式中的领域事件可以用来描述系统中发生的重要事件,例如订单状态变更、库存变更等。
在一个在线教育平台的工程案例中,可以使用DDD模式将学生的选课行为、课程开设等事件进行建模,以便及时响应和处理。
总的来说,DDD模式可以在各种软件工程案例中发挥作用,通过领域模型设计、聚合根与实体、领域服务和领域事件等概念的应用,帮助开发人员更好地理解和满足业务需求,提高系统的可维护性和扩展性。
希望以上介绍能够帮助你更好地理解DDD模式在工程案例中的应用。
DDD领域驱动设计实践
DDD领域驱动设计实践领域驱动设计(Domain Driven Design,DDD)是一种软件开发的方法论,它强调的是软件开发过程中需要将业务领域专家和技术团队之间的理解进行深度沟通,从而将业务领域的复杂问题转化为开发过程能够理解和处理的模型。
DDD的核心思想是将业务逻辑和技术实现分离,将业务领域的模型映射到代码中,从而使代码具有更高的可维护性、扩展性和可重用性。
在实践中,我们需要对DDD的各个方面进行深入了解和应用。
下面是一些关键点。
1. 了解业务领域模型在DDD的实践中,首先需要了解和分析业务领域的模型,其中包括领域概念、业务规则、业务流程等。
这是因为在软件开发过程中,我们需要对业务领域模型进行深入理解,从而处理业务领域的复杂问题,并将其映射到代码实现中。
2. 使用Ubiquitous LanguageUbiquitous Language是一种在业务领域模型中使用的共同语言,它是所有业务参与者都能够理解和沟通的统一语言。
在DDD中,我们需要使用Ubiquitous Language来描述业务领域的模型,确保所有参与者都能够理解和认可该模型,从而减少在开发过程中出现的理解和沟通障碍。
3. 划分子域划分子域是DDD中的一个关键概念,它将业务领域模型划分为若干个独立的子域,每个子域包含一组相关的业务概念和业务规则。
通过划分子域,可以将复杂的业务领域模型分解为一些更加易于理解和处理的部分,从而提高开发效率和质量。
4. 设计领域层模型领域层是DDD中非常重要的一部分,它主要负责处理业务领域的问题,在其中应用领域模型。
在设计领域层模型时,需要考虑以下几个方面:(1)设计领域模型,包括实体、值对象、聚合、事件等。
(2)实现领域服务,为应用层提供统一的领域逻辑。
(3)实现领域事件,用于解耦领域层和其他层之间的关系。
(4)遵循领域驱动设计原则,保证模型的合理性和可扩展性。
5. 实现应用层服务应用层是DDD中另一个重要的概念,它负责接收用户请求,并调用合适的领域层服务来处理业务逻辑。
ddd领域模型设计 实践
领域驱动设计(DDD)是一种软件设计方法,它强调将领域专家和开发人员紧密合作,以构建精确、一致的模型来捕捉业务实体及其关系。
在实践中,DDD领域模型设计可以按照以下步骤进行:
1. 确定核心域:首先需要确定系统设计的核心域,这个核心域通常是最具代表性的业务领域,也是系统设计的关键部分。
2. 定义实体:在核心域中,定义实体以及实体的属性,这些实体是业务领域中的对象,具有可标识性、状态和行为。
3. 建立领域模型:根据实体之间的关系,建立领域模型。
领域模型包括聚合、聚合根、值对象等概念,这些概念可以描述业务领域的状态和行为。
4. 设计数据访问对象(DAO):DAO是领域模型的数据访问对象,它负责数据的持久化存储和访问。
在DDD中,每个实体都有一个对应的DAO,用于实现对实体的增删改查等操作。
5. 实现服务层:在DAO之上,实现服务层。
服务层利用DAO 实现具体的业务逻辑,例如增删改查等操作。
6. 映射数据库表:根据领域模型的设计,将实体映射到数据库表中。
在映射过程中,需要遵循数据库表的规范,如数据类型、字段长度等。
7. 测试和验证:最后,对设计的领域模型进行测试和验证,确保模型的准确性和一致性。
测试和验证可以通过单元测试、集成测试和系统测试等方式进行。
通过以上步骤,可以逐步建立起领域驱动设计的领域模型,从而更好地支持业务需求和系统设计。
需要注意的是,DDD领域模型设计需要不断迭代和优化,以适应业务需求的变化和技术发展的趋势。
DDD—什么是领域驱动设计
DDD—什么是领域驱动设计领域驱动设计(Domain-Driven Design,DDD)是一种软件开发方法,旨在将软件系统的设计与特定的业务领域相对应。
在DDD中,开发团队将重点放在业务领域上,而不是技术实现上。
通过使用DDD,开发团队可以更好地理解业务需求,并将其映射到软件系统的设计中,以实现更好的业务价值。
DDD的核心概念是领域模型,它是对业务领域的抽象表示。
领域模型由领域实体、值对象、聚合、服务等构成,它们之间通过领域事件和领域服务进行交互。
领域模型与业务领域紧密相关,反映了业务需求和规则的实际情况。
在DDD中,领域专家起着至关重要的作用。
他们是对业务领域最了解的人,可以与开发团队紧密合作,共同定义领域模型和业务需求。
通过与领域专家的交流和合作,开发团队可以更好地理解业务需求,确保软件系统的设计与业务需求一致。
另一个重要的概念是域驱动设计模式(DDD Patterns),它是一组在DDD中常见的设计模式和最佳实践。
这些模式包括实体模型、值对象模型、聚合模型、工厂模型、仓储模型等,它们帮助开发团队有效地构建领域模型,并确保软件系统的可扩展性和可维护性。
在DDD中,设计思想的核心是分层架构。
其将软件系统分为应用层、领域层和基础设施层。
应用层负责处理用户请求和调度领域对象,领域层包含领域模型和业务规则的实现,基础设施层包含与外部系统的交互和数据持久化。
通过这种分层架构,软件系统的各个部分可以相对独立地演化和扩展,从而提高系统的可维护性和可扩展性。
DDD的目标是通过更好地理解业务需求和规则,构建与之一致的软件系统。
通过将实际的业务需求映射到软件系统的设计中,开发团队可以更好地满足用户需求,并提供更好的用户体验。
除此之外,DDD还可以减少软件系统的复杂性,提高系统的可维护性和可扩展性。
综上所述,领域驱动设计是一种致力于构建与业务需求一致的软件系统的设计方法。
通过使用领域模型、领域驱动设计模式和分层架构,开发团队可以更好地理解业务需求,构建可维护和可扩展的软件系统。
领域驱动设计(DDD)实践之路(四)领域驱动在微服务设计中的应用
领域驱动设计(DDD)实践之路(四)领域驱动在微服务设计中的应用领域驱动设计(Domain-Driven Design, DDD)是一种软件开发方法论,着重于将业务逻辑与软件设计相结合,以实现可靠、可扩展、可维护的软件系统。
在微服务架构设计中,DDD能够提供一种有效的方法来划分领域边界,并促进微服务的可独立开发、部署和升级。
在微服务架构中,每个微服务都是一个独立的、自治的组件,负责处理领域内的一部分业务逻辑。
领域驱动设计可以帮助我们识别和定义每个微服务的领域边界。
通过聚焦每个微服务的业务核心,我们可以将复杂的系统拆分为一系列互相协同合作的微服务。
在微服务设计中,常见的问题是如何定义微服务的边界和交互方式。
DDD中的领域模型可以帮助我们回答这些问题。
通过将领域模型映射到微服务之间的接口和交互,我们可以更好地理解和划分微服务的边界。
同时,领域驱动设计还提供了一些设计模式和技术,如聚合根、值对象、事件驱动等,用于解决微服务之间的复杂性和交互问题。
另一个微服务设计中的重要问题是如何管理领域模型的一致性。
在微服务架构中,每个微服务都有自己的数据库,因此领域模型需要在不同的微服务之间进行同步和共享。
DDD中的领域事件可以帮助我们解决这个问题。
通过将领域事件作为微服务之间的消息传递机制,我们可以实现领域模型的一致性和同步。
此外,领域驱动设计还可以帮助我们解决微服务架构中的其他挑战,如数据一致性、数据迁移、分布式事务等。
通过在领域模型中定义正确的聚合根和值对象,并使用适当的设计模式和技术,我们可以更好地管理和处理这些问题。
最后,领域驱动设计在微服务设计中的应用需要结合实际场景和业务需求进行判断和选择。
不同的业务领域和系统架构可能需要不同的设计方法和技术。
因此,在应用DDD的同时,我们还需要考虑业务的特点、团队的能力和项目的需求,来选择合适的设计方法和技术。
总之,领域驱动设计在微服务设计中的应用可以提供一种有效的方法来划分领域边界、管理领域模型的一致性,并解决微服务架构中的其他挑战。
【DDD】领域驱动设计实践——Domain层实现
【DDD】领域驱动设计实践——Domain层实现本⽂是DDD框架实现讲解的第三篇,主要介绍了DDD的Domain层的实现,详细讲解了entity、value object、domain event、domain service的职责,以及如何识别出领域中的这些对象,并附有具体的业务建模⽰例。
相⽐于《领域驱动设计》原书中的航运系统例⼦,社交服务系统的业务场景对于⼤家更加熟悉,相信更好理解。
本⽂是【DDD】系列⽂章的其中⼀篇,其他可参考:。
Domain层 Domain层是具体的业务领域层,是发⽣业务变化最为频繁的地⽅,是业务系统最核⼼的⼀层,是DDD关注的焦点和难点。
这⼀层包含了如下⼀些domain object:entity、value object、domain event、domain service、factory、repository等。
DDD实践的难点其实就在于如何识别这些object。
下⾯将⼀⼀说明他们。
domain entity 领域实体是domain的核⼼成员。
domain entity具有如下三个特征:唯⼀业务标识持有⾃⼰的业务属性和业务⾏为属性可变,有着⾃⼰的⽣命周期 在社区这⼀业务领域中,‘帖⼦’就是⼀个业务实体,它需要有⼀个唯⼀性业务标识表征,拥有这个业务实体相关的业务属性(作者、标题、内容等)和业务⾏为(关联话题、删帖等),同时他的状态和内容可以不断发⽣变化。
⽰例代码如下:public class Post {/*** 帖⼦id*/private long id; //1、‘帖⼦’实体有唯⼀业务标识/***帖⼦作者*/private long authorId;/*** 帖⼦标题*/private String title;//2、‘帖⼦’实体拥有⾃⼰的业务属性/*** 帖⼦源内容*/private String sourceContent;/*** 发帖时间*/private Timestamp postingTime;/*** 帖⼦状态* NOTE:使⽤enum实现,限定status的字典值* @see munity.domain.model.post.PostStatus*/private PostStatus status;/*** 帖⼦作者*/private PostAuthor postAuthor;/*** 帖⼦加⼊的话题*/private Set<TopicPost> topics = new HashSet<TopicPost>();private Post() {this.postingTime = new Timestamp(System.currentTimeMillis());}public Post(long id) {this.setId(id);}public Post(long authorId, String title, String sourceContent) {this();this.setAuthorId(authorId);this.setTitle(title);this.setSourceContent(sourceContent);this.setPostAuthor(new PostAuthor(authorId));}/*** 删除帖⼦*/public void delete() {this.setStatus(PostStatus.HAS_DELETED);//3、帖⼦的状态可以改变}/*** 将帖⼦关联话题* @param topicIds 话题集合*/public void joinTopics(String topicIds) throws BusinessException{//2、‘帖⼦’实体拥有⾃⼰的业务⾏为if(StringUtils.isEmpty(topicIds)) {return;}String[] topicIdArray = topicIds.split(MA);for(int i=0; i<topicIdArray.length; i++) {TopicPost topicPost = new TopicPost(Long.valueOf(topicIdArray[i]), this.getId());this.topics.add(topicPost);if(topicSize() > MAX_JOINED_TOPICS_NUM) {throw new BusinessException(ReturnCode.ONE_POST_MOST_JOIN_INTO_FIVE_TOPICS);}}}//......value object领域值对象。
基于ddd领域驱动的电商履约案例
基于ddd领域驱动的电商履约案例在传统的电商平台中,履约环节通常是电商企业与第三方物流公司之间的配送流程。
而随着领域驱动设计(DDD)的兴起,电商企业开始将履约环节视为核心业务,并由自身负责物流履约环节的管理,以提高交付效率和服务质量。
本文基于DDD领域驱动的电商履约案例,介绍一个完整的履约业务流程,并分析其中的关键问题和解决方案。
一、领域建模和划分在电商履约业务中,涉及到多个领域对象,如订单、仓库、库存、配送路线等。
我们可以根据业务需求进行划分,将不同的领域对象划分为不同的子领域,每个子领域负责处理自身的业务逻辑。
例如,订单子领域负责处理订单相关的操作和业务规则,仓库子领域负责管理仓库信息和库存管理,配送子领域负责处理配送路线规划和物流配送等。
二、履约业务流程1.订单生成:用户在电商平台上下订单,生成订单信息,并选择配送方式。
2.库存管理:仓库子领域接收订单信息,根据仓库库存情况判断是否可以满足订单需求,更新库存信息。
3.路线规划:配送子领域接收订单信息,根据配送点和仓库地址之间的距离,规划最优配送路线。
4.物流配送:配送子领域将配送任务分派给对应的配送员,配送员按照规定路线进行配送,将商品送达用户手中。
5.签收确认:用户签收商品后,在电商平台上确认收货,履约环节结束。
三、关键问题与解决方案1.库存管理:如何保证订单生成后及时更新库存信息?解决方案:在订单生成时,通过领域事件将订单信息发送给仓库子领域,仓库子领域通过监听订单生成事件,及时更新库存信息。
同时,利用分布式事务保证数据的一致性和完整性。
2.路线规划:如何实现最优配送路线的规划?解决方案:借助地图API,根据配送点和仓库地址之间的距离,选择最短路径进行路线规划。
同时,考虑交通情况、配送员负荷等因素进行路线优化。
3.物流配送:如何确保配送员按时配送,并提供实时配送状态?解决方案:利用物联网技术,为配送员配备GPS定位设备,将配送任务信息实时传输给配送员。
领域驱动设计实践教学案例
领域驱动设计实践教学案例一、教学背景。
想象一下,我们要教一群充满活力但又对复杂设计概念有点迷糊的学生领域驱动设计(DDD)。
传统的干巴巴讲解肯定不行,那咱们就来个有趣的宠物商店项目,让知识变得生动起来。
二、项目启动:了解宠物商店的世界。
1. 场景描绘。
咱们先和学生们一起幻想一个超级酷的宠物商店。
这个商店里有各种各样的宠物,像调皮的小猫咪,会汪汪叫的小狗狗,还有毛茸茸的小兔子。
还有照顾这些宠物的工作人员,比如热情的店员和专业的兽医。
然后我们问学生们,如果要管理这个宠物商店,需要考虑哪些东西呢?这就像是打开了话匣子,他们会开始七嘴八舌地说,要知道宠物的品种、价格,还要知道工作人员的排班等等。
2. 界定问题领域。
我们引导学生把这些杂乱的想法进行分类。
和宠物本身相关的信息(品种、年龄、健康状况等)是一个领域,商店的运营管理(库存管理、人员管理等)是另一个领域。
这就像是把一堆五颜六色的乐高积木按照形状和功能分类一样。
幽默地告诉学生:“如果把宠物商店看成一个大拼图,我们现在要找出每一块小拼图的样子,然后才能把这个大拼图拼好。
”三、实体与值对象的探索。
1. 宠物实体。
我们拿小猫咪举例。
小猫咪在宠物商店里是一个实体,它有自己独特的身份标识,就像它的名字或者宠物编号。
它还有很多属性,像它的品种(是布偶猫还是橘猫呢?)、年龄(是小奶猫还是已经成年的大猫?)、颜色(白色、黑色还是花色的?)。
对学生说:“这小猫咪就像一个小明星,有自己的名字牌(身份标识),还有一堆描述它的标签(属性)。
”2. 值对象。
再看宠物的价格。
宠物的价格不像宠物本身那样有一个单独的身份,它是依赖于宠物这个实体存在的。
如果一只橘猫的价格是500元,这个500元就是一个值对象。
它只表示橘猫的价格这个属性的值,而且这个值可能会随着市场供求关系而变化。
打趣地说:“这价格就像小猫咪的一件小外套,它可以换(价格可以变),而且它只属于这只小猫咪(依赖于宠物实体)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
领域驱动设计(DDD)架构的实践前言至少30年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,Eric Evans将其定义为领域驱动设计(Domain-Driven Design,简称DDD)。
在互联网开发“小步快跑,迭代试错”的大环境下,DDD似乎是一种比较“古老而缓慢”的思想。
然而,由于互联网公司也逐渐深入实体经济,业务日益复杂,我们在开发中也越来越多地遇到传统行业软件开发中所面临的问题。
本文就先来讲一下这些问题,然后再尝试在实践中用DDD的思想来解决这些问题。
问题过度耦合业务初期,我们的功能大都非常简单,普通的CRUD就能满足,此时系统是清晰的。
随着迭代的不断演化,业务逻辑变得越来越复杂,我们的系统也越来越冗杂。
模块彼此关联,谁都很难说清模块的具体功能意图是啥。
修改一个功能时,往往光回溯该功能需要的修改点就需要很长时间,更别提修改带来的不可预知的影响面。
下图是一个常见的系统耦合病例。
订单服务接口中提供了查询、创建订单相关的接口,也提供了订单评价、支付、保险的接口。
同时我们的表也是一个订单大表,包含了非常多字段。
在我们维护代码时,牵一发而动全身,很可能只是想改下评价相关的功能,却影响到了创单核心路径。
虽然我们可以通过测试保证功能完备性,但当我们在订单领域有大量需求同时并行开发时,改动重叠、恶性循环、疲于奔命修改各种问题。
上述问题,归根到底在于系统架构不清晰,划分出来的模块内聚度低、高耦合。
有一种解决方案,按照演进式设计的理论,让系统的设计随着系统实现的增长而增长。
我们不需要作提前设计,就让系统伴随业务成长而演进。
这当然是可行的,敏捷实践中的重构、测试驱动设计及持续集成可以对付各种混乱问题。
重构——保持行为不变的代码改善清除了不协调的局部设计,测试驱动设计确保对系统的更改不会导致系统丢失或破坏现有功能,持续集成则为团队提供了同一代码库。
在这三种实践中,重构是克服演进式设计中大杂烩问题的主力,通过在单独的类及方法级别上做一系列小步重构来完成。
我们可以很容易重构出一个独立的类来放某些通用的逻辑,但是你会发现你很难给它一个业务上的含义,只能给予一个技术维度描绘的含义。
这会带来什么问题呢?新同学并不总是知道对通用逻辑的改动或获取来自该类。
显然,制定项目规范并不是好的idea。
我们又闻到了代码即将腐败的味道。
事实上,你可能意识到问题之所在。
在解决现实问题时,我们会将问题映射到脑海中的概念模型,在模型中解决问题,再将解决方案转换为实际的代码。
上述问题在于我们解决了设计到代码之间的重构,但提炼出来的设计模型,并不具有实际的业务含义,这就导致在开发新需求时,其他同学并不能很自然地将业务问题映射到该设计模型。
设计似乎变成了重构者的自娱自乐,代码继续腐败,重新重构……无休止的循环。
用DDD则可以很好地解决领域模型到设计模型的同步、演化,最后再将反映了领域的设计模型转为实际的代码。
注:模型是我们解决实际问题所抽象出来的概念模型,领域模型则表达与业务相关的事实;设计模型则描述了所要构建的系统。
贫血症和失忆症贫血领域对象贫血领域对象(Anemic Domain Object)是指仅用作数据载体,而没有行为和动作的领域对象。
在我们习惯了J2EE的开发模式后,Action/Service/DAO这种分层模式,会很自然地写出过程式代码,而学到的很多关于OO理论的也毫无用武之地。
使用这种开发方式,对象只是数据的载体,没有行为。
以数据为中心,以数据库ER设计作驱动。
分层架构在这种开发模式下,可以理解为是对数据移动、处理和实现的过程。
以笔者最近开发的系统抽奖平台为例:场景需求奖池里配置了很多奖项,我们需要按运营预先配置的概率抽中一个奖项。
实现非常简单,生成一个随机数,匹配符合该随机数生成概率的奖项即可。
∙贫血模型实现方案先设计奖池和奖项的库表配置。
∙设计AwardPool和Award两个对象,只有简单的get和set属性的方法∙Service代码实现设计一个LotteryService,在其中的drawLottery()方法写服务逻辑按照我们通常思路实现,可以发现:在业务领域里非常重要的抽奖,我的业务逻辑都是写在Service中的,Award充其量只是个数据载体,没有任何行为。
简单的业务系统采用这种贫血模型和过程化设计是没有问题的,但在业务逻辑复杂了,业务逻辑、状态会散落到在大量方法中,原本的代码意图会渐渐不明确,我们将这种情况称为由贫血症引起的失忆症。
更好的是采用领域模型的开发方式,将数据和行为封装在一起,并与现实世界中的业务对象相映射。
各类具备明确的职责划分,将领域逻辑分散到领域对象中。
继续举我们上述抽奖的例子,使用概率选择对应的奖品就应当放到AwardPool类中。
为什么选择DDD软件系统复杂性应对解决复杂和大规模软件的武器可以被粗略地归为三类:抽象、分治和知识。
分治把问题空间分割为规模更小且易于处理的若干子问题。
分割后的问题需要足够小,以便一个人单枪匹马就能够解决他们;其次,必须考虑如何将分割后的各个部分装配为整体。
分割得越合理越易于理解,在装配成整体时,所需跟踪的细节也就越少。
即更容易设计各部分的协作方式。
评判什么是分治得好,即高内聚低耦合。
抽象使用抽象能够精简问题空间,而且问题越小越容易理解。
举个例子,从北京到上海出差,可以先理解为使用交通工具前往,但不需要一开始就想清楚到底是高铁还是飞机,以及乘坐他们需要注意什么。
知识顾名思义,DDD可以认为是知识的一种。
DDD提供了这样的知识手段,让我们知道如何抽象出限界上下文以及如何去分治。
与微服务架构相得益彰微服务架构众所周知,此处不做赘述。
我们创建微服务时,需要创建一个高内聚、低耦合的微服务。
而DDD中的限界上下文则完美匹配微服务要求,可以将该限界上下文理解为一个微服务进程。
上述是从更直观的角度来描述两者的相似处。
在系统复杂之后,我们都需要用分治来拆解问题。
一般有两种方式,技术维度和业务维度。
技术维度是类似MVC这样,业务维度则是指按业务领域来划分系统。
微服务架构更强调从业务维度去做分治来应对系统复杂度,而DDD也是同样的着重业务视角。
如果两者在追求的目标(业务维度)达到了上下文的统一,那么在具体做法上有什么联系和不同呢?我们将架构设计活动精简为以下三个层面:∙业务架构——根据业务需求设计业务模块及其关系∙系统架构——设计系统和子系统的模块∙技术架构——决定采用的技术及框架以上三种活动在实际开发中是有先后顺序的,但不一定孰先孰后。
在我们解决常规套路问题时,我们会很自然地往熟悉的分层架构套(先确定系统架构),或者用PHP开发很快(先确定技术架构),在业务不复杂时,这样是合理的。
跳过业务架构设计出来的架构关注点不在业务响应上,可能就是个大泥球,在面临需求迭代或响应市场变化时就很痛苦。
DDD的核心诉求就是将业务架构映射到系统架构上,在响应业务变化调整业务架构时,也随之变化系统架构。
而微服务追求业务层面的复用,设计出来的系统架构和业务一致;在技术架构上则系统模块之间充分解耦,可以自由地选择合适的技术架构,去中心化地治理技术和数据。
可以参见下图来更好地理解双方之间的协作关系:如何实践DDD我们将通过上文提到的抽奖平台,来详细介绍我们如何通过DDD来解构一个中型的基于微服务架构的系统,从而做到系统的高内聚、低耦合。
首先看下抽奖系统的大致需求:运营——可以配置一个抽奖活动,该活动面向一个特定的用户群体,并针对一个用户群体发放一批不同类型的奖品(优惠券,激活码,实物奖品等)。
用户-通过活动页面参与不同类型的抽奖活动。
设计领域模型的一般步骤如下:1.根据需求划分出初步的领域和限界上下文,以及上下文之间的关系;2.进一步分析每个上下文内部,识别出哪些是实体,哪些是值对象;3.对实体、值对象进行关联和聚合,划分出聚合的范畴和聚合根;4.为聚合根设计仓储,并思考实体或值对象的创建方式;5.在工程中实践领域模型,并在实践中检验模型的合理性,倒推模型中不足的地方并重构。
战略建模战略和战术设计是站在DDD的角度进行划分。
战略设计侧重于高层次、宏观上去划分和集成限界上下文,而战术设计则关注更具体使用建模工具来细化上下文。
领域现实世界中,领域包含了问题域和解系统。
一般认为软件是对现实世界的部分模拟。
在DDD中,解系统可以映射为一个个限界上下文,限界上下文就是软件对于问题域的一个特定的、有限的解决方案。
限界上下文限界上下文一个由显示边界限定的特定职责。
领域模型便存在于这个边界之内。
在边界内,每一个模型概念,包括它的属性和操作,都具有特殊的含义。
一个给定的业务领域会包含多个限界上下文,想与一个限界上下文沟通,则需要通过显示边界进行通信。
系统通过确定的限界上下文来进行解耦,而每一个上下文内部紧密组织,职责明确,具有较高的内聚性。
一个很形象的隐喻:细胞质所以能够存在,是因为细胞膜限定了什么在细胞内,什么在细胞外,并且确定了什么物质可以通过细胞膜。
划分限界上下文划分限界上下文,不管是Eric Evans还是Vaughn Vernon,在他们的大作里都没有怎么提及。
显然我们不应该按技术架构或者开发任务来创建限界上下文,应该按照语义的边界来考虑。
我们的实践是,考虑产品所讲的通用语言,从中提取一些术语称之为概念对象,寻找对象之间的联系;或者从需求里提取一些动词,观察动词和对象之间的关系;我们将紧耦合的各自圈在一起,观察他们内在的联系,从而形成对应的界限上下文。
形成之后,我们可以尝试用语言来描述下界限上下文的职责,看它是否清晰、准确、简洁和完整。
简言之,限界上下文应该从需求出发,按领域划分。
前文提到,我们的用户划分为运营和用户。
其中,运营对抽奖活动的配置十分复杂但相对低频。
用户对这些抽奖活动配置的使用是高频次且无感知的。
根据这样的业务特点,我们首先将抽奖平台划分为C端抽奖和M端抽奖管理平台两个子域,让两者完全解耦。
在确认了M端领域和C端的限界上下文后,我们再对各自上下文内部进行限界上下文的划分。
下面我们用C端进行举例。
产品的需求概述如下:根据产品的需求,我们提取了一些关键性的概念作为子域,形成我们的限界上下文。
首先,抽奖上下文作为整个领域的核心,承担着用户抽奖的核心业务,抽奖中包含了奖品和用户群体的概念。
在设计初期,我们曾经考虑划分出抽奖和发奖两个领域,前者负责选奖,后者负责将选中的奖品发放出去。
但在实际开发过程中,我们发现这两部分的逻辑紧密连接,难以拆分。
并且单纯的发奖逻辑足够简单,仅仅是调用第三方服务进行发奖,不足以独立出来成为一个领域。
对于活动的限制,我们定义了活动准入的通用语言,将活动开始/结束时间,活动可参与次数等限制条件都收拢到活动准入上下文中。