[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的分层架构是一个四层架构,从上到下依次是:用户接口层、应用层、领域层和基础层。
阅读全文