[db:标题]
摘要:前言 领域驱动设计(DDD,Domain-Driven Design)是一套以业务领域知识为中心、以统一语言和模型为驱动的复杂软件系统设计方法学。 它的核心思想是:把技术实现与业务知识深度融合,让代码成为业务概念的忠实映射,从而持续交付真正
前言
领域驱动设计(DDD,Domain-Driven Design)是一套以业务领域知识为中心、以统一语言和模型为驱动的复杂软件系统设计方法学。
它的核心思想是:把技术实现与业务知识深度融合,让代码成为业务概念的忠实映射,从而持续交付真正解决业务问题的软件。
领域驱动设计相关概念
领域模型
领域模型是业务概念在程序中的一种表达方式。
领域模型可以用来设计和理解整个软件结构。面向对象设计中的类概念是领域模型的一种表达方式。与此类似,UML的建模方法也可以应用在对领域模型的表达上。
但是要区分的一点就是,领域模型≠数据模型。
领域模型的组成元素:实体、值对象、聚合、领域服务、领域事件
实体(Entity)
实体通常指具有唯一标识的具体对象或事物。
实体通常具有自己的生命周期,可以被创建、修改和删除。
在数据库中,实体通常对应着数据库表的一行记录,每个实体具有唯一的标识符(通常是主键)。
在代码模型中,实体的表现形式是实体类,这个类包含了实体的属性和方法,通过这些方法实现实体自身的业务逻辑。
值对象(Value Object)
值对象(Value Object)是通过对象属性值来识别的对象,它将多个相关属性组合为一个概念整体。
实体可以使用 ID 标识,但是值对象是用属性标识,值对象通常不可变,一旦创建就不能修改,只能通过创建新的值对象来替换原来的值对象。
在数据库中,值对象通常对应着数据库表的一组字段,每个值对象不具有唯一的标识符而是通过一组字段来描述其属性。
值对象在代码中有这样两种形态。
如果值对象是单一属性,则直接定义为实体类的属性;
如果值对象是属性集合,则把它设计为 Class 类,Class 将具有整体概念的多个属性归集到属性集合,这样的值对象没有 ID,会被实体整体引用。
聚合
聚合(Aggregate)是由一个或多个强关联的实体和值对象组成的集合。
领域模型内的实体和值对象就好比个体,而能让实体和值对象协同工作的组织就是聚合,它用来确保这些领域对象在实现共同的业务逻辑时,能保证数据的一致性。
聚合有一个聚合根和上下文边界,这个边界根据业务单一职责和高内聚原则,定义了聚合内部应该包含哪些实体和值对象,而聚合之间的边界是松耦合的。按照这种方式设计出来的微服务很自然就是“高内聚、低耦合”的
聚合根
聚合根(Aggregate Root)是聚合的根实体,它不仅是实体,也是聚合的管理者,管理着聚合内其他对象的生命周期和完整性。
聚合根是聚合中的唯一标识符,是整个聚合的唯一入口点,所有的操作都是通过聚合根来进行的。
领域服务
领域服务(Domain Service)主要用于处理那些不适合放在实体(Entity)或值对象(Value Object)中的业务逻辑。
领域服务具有以下特点:
领域逻辑的封装 :领域服务封装了领域特定的业务逻辑,这些逻辑通常涉及多个领域对象的交互,这种封装有助于保持实体和值对象的职责单一和清晰
无状态:领域服务通常是无状态的,它们不保存任何业务数据,而是操作领域对象来完成业务逻辑。这有助于保持服务的可重用性和可测试性。
独立性:领域服务通常与特定的实体或值对象无关,它们提供了一种独立于领域模型的其他部分的方式来实现业务规则
重用性:领域服务可以被不同的应用请求重用,例如不同的应用服务编排或领域事件处理器
接口清晰:领域服务的接口应该清晰的反映其提供的业务能力,参数的返回值应该是领域对象或基本数据类型
领域事件
领域事件(Domain Event)代表领域中的发生的重要事件,可以用于通知其他领域对象或跨限界上下文进行解耦和协作。
这些事件通常是由领域实体或聚合根的状态变化触发的。领域事件不仅仅是数据的变化,它们还承载了业务上下文和业务意图。
领域事件具有以下特点:
意义明确:领域事件通常具有明确的业务含义,例如“用户已下单”、“商品已支付”等。
不可变性:一旦领域事件被创建,它的状态就不应该被改变。这有助与确保事件的一致性和可靠性。
时间相关性:领域事件通常包括事件发生的时间戳,这有助于追踪事件的顺序和时间线
关联性:领域事件可能被特定的领域实体和聚合根相关联,者有助于完成事件上下文
可观察性:领域事件可以被其他部分的系统监听和响应,有助于实现系统间解耦
领域事件和我们常听说的MQ中的事件不一样,一般不会在分布式系统之间传递,只会在单个微服务内部传递。
它起到最大的好处和MQ一样,就是解耦,通过事件的方式来解除领域之间的耦合,通过发布事件的方式进行一种松耦合的通信,而不用依赖具体的实现细节。
领域模型分层架构
DDD的分层架构是一个四层架构,从上到下依次是:用户接口层、应用层、领域层和基础层。
