08.领域驱动设计:深入理解领域模型的核心概念

目录

1.概要

2.领域模型

3.限界上下文(战略)

4.领域对象(Domain Object)

5.实体(Entity)

6.值对象(Value Object)

7.聚合(Aggregate)

8.聚合根(Aggregate Root)

9.领域服务(Domain Service)

10.领域事件(Domain Event)

11.模块(Module)

12.总结


1.概要

领域驱动模型(Domain-Driven Design,简称DDD)是一种软件开发方法论,强调将软件系统的设计与领域模型紧密结合,以解决复杂业务领域的问题

领域模型是领域驱动设计(DDD)中的核心概念之一,它是对业务领域的概念、实体、规则和行为的抽象表示

领域模型通过使用领域对象、实体、值对象、聚合根、领域服务等概念,进行描述业务领域的核心概念和关系。

2.领域模型

  • 领域(战略):业务范围,范围就是边界。

  • 子领域:领域可大可小,我们将一个领域进行拆解形成子领域,子领域还可以进行拆解。当一个领域太大的时候需要进行细化拆解。

  • 模型(战术):基于某个业务领域识别出这个业务领域的聚合,聚合根,界限上下文,实体,值对象

领域模型通过使用领域对象、实体、值对象、聚合根、领域服务等概念,进行描述业务领域的核心概念和关系。

3.限界上下文(战略)

业务的边界的划分,这个边界可以是一个领域或者多个领域的集合。复杂业务需要多个域编排完成一个复杂业务流程。限界上下文可以作为微服务划分的方法

  • 其本质还是高内聚、低耦合,只是限界上下文只是站在更高的层面来进行划分。

  • 如何进行划分,我的方法是一个界限上下文必须支持一个完整的业务流程,保证这个业务流程所涉及的领域都在一个限界上下文中。

4.领域对象(Domain Object)

领域对象是领域模型中的实体,代表领域中的具体概念或事物,如订单、用户、产品等。

  • 领域对象具有状态和行为,并通过方法来执行业务操作

  • 领域对象反映了业务领域中的核心概念和实体之间的关系。

5.实体(Entity)

具有唯一标识的领域对象具有自己的生命周期和状态,并且可以进行行为操作。

例如一个交易订单,从创建订单我们会给他一个订单编号并且是唯一的这就是实体唯一标识。同时

订单实体会从创建,支付,发货等过程最终走到终态这就是实体的生命周期。订单实体在这个过程

中属性发生了变化,但订单还是那个订单,不会因为属性的变化而变化,这就是实体的延续性。

  • 唯一标识:实体必须有一个唯一标识,用于区分不同的实体。通常使用一个唯一的ID或者是一组属性的组合来标识实体。唯一标识可以用于在领域模型中找到和操作对应的实体对象。

  • 生命周期和状态:实体拥有自己的生命周期,它可以处于不同的状态,并在状态之间转换。例如,一个订单实体可以处于“待支付”、“已支付”、“已取消”等不同的状态,每个状态对应不同的业务逻辑和行为。

  • 行为操作:实体可以执行一些行为操作,对其内部的状态和属性进行修改,并与其他实体进行交互。行为操作通常以方法的形式存在,用于执行实体的业务逻辑。例如,订单实体可以执行“支付”、“取消”、“修改收货地址”等行为操作。

  • 聚合根:实体可以作为聚合根的一部分存在。聚合根是聚合的访问入口,负责维护整个聚合的一致性和完整性。通过聚合根可以对聚合内的其他实体和值对象进行访问和操作。

  • 持久化:实体通常需要被保存在持久化媒介中,如数据库。在领域驱动设计中,采用领域驱动的方式来设计和访问实体的持久化是一个很重要的概念。持久化技术可以将实体保存和加载到持久化媒介中,以便在不同的应用程序执行周期中保留实体的状态。

实体是领域模型中最重要的概念之一,它代表了业务领域中具体的概念或事物,并且具有自身的行为和属性。

通过实体的定义和操作,可以更好地描述和实现业务逻辑,使领域模型更加贴近实际业务需求,并具备高内聚、低耦合的特性。

6.值对象(Value Object)

值对象是不可变的对象,它通常用于表示没有唯一标识的概念,通常由一组属性组成,用于描述某个领域概念的属性集合,如日期、时间、货币等。

  • 它是不可变的,不会被修改,每次操作都会创建一个新的实例。

  • 值对象没有独立存在的生命周期,它的属性值决定了对象的相等性。

  • 值对象被视为整体,相等性通常基于属性值的比较

值对象的优势和局限:

  1. 简化数据库设计,提升数据库操作的性能(多表新增和修改,关联表查询)。

  2. 虽然简化数据库设计,但是领域模型还是可以表达业务。

  3. 序列化的方式会使搜索实现困难(通过搜索引擎可以解决)。

7.聚合(Aggregate)

聚合是一组相关的实体和值对象的集合。

  • 聚合通过聚合根来保护整个聚合的一致性和完整性,从外部只能访问聚合根

  • 聚合根的作用是保证内部的实体的一致性,对外只需要对聚合根进行操作

  • 多个实体和值对象组成的我们叫聚合,聚合的内部一定的高内聚。这个聚合里面一定有一个实体是聚合根

8.聚合根(Aggregate Root)

聚合根是领域模型中的一个重要概念,它是一组相关联的实体和值对象的根(聚合的根节点),它代表着聚合的唯一访问入口,并且负责保护整个聚合的一致性和完整性。

  • 聚合根是一组相关联的实体和值对象的根节点。

  • 只有聚合根能从外部访问和操作聚合内的其他对象。

  • 聚合根是聚合的访问入口,只有通过聚合根才能访问和操作聚合内的其他对象。

  • 聚合根负责维护整个聚合的一致性和完整性,其他对象只能通过聚合根来访问。

  • 通过聚合根,可以访问和操作聚合内的其他实体和值对象。

  • 聚合根负责事务的一致性和完整性,它封装了聚合内部的业务规则和操作,并提供了统一的接口

  • 聚合根通常是一个实体,但也可以是一个值对象,具体取决于业务需求。

聚合和聚合根的设计原则和目的

  1. 保持一致性:聚合内的实体和值对象之间形成一个逻辑的整体,聚合根负责确保聚合内的对象之间的一致性,以避免数据不一致或业务逻辑错误。

  2. 降低复杂性:通过将相关的对象集合到一个聚合中,可以降低整体的复杂性和耦合度。聚合根提供了对聚合内对象的访问接口,其他对象无法直接访问聚合内的对象,从而简化了整体的设计和使用。

  3. 边界清晰:聚合定义了一组对象之间的边界,通过聚合根作为访问入口,清晰地标识了整个聚合的范围和使用方式。通过定义聚合内对象之间的关系和行

    为,可以更好地组织和管理业务逻辑。

  4. 提高性能:通过将相关的对象一起加载和保存,可以减少数据库访问次数,提高性能。聚合根负责从持久化媒介中加载聚合内的对象,并将对聚合内对象的修改保存回持久化媒介。

在实际应用中,设计聚合和聚合根需要根据具体业务需求进行,需要考虑领域模型的复杂性、一致性和性能等方面的因素。

9.领域服务(Domain Service)

领域服务是一种无状态的、多个实体和值对象之间交互行为的抽象,它通常不拥有状态,用于处理不适合归属于某个特定实体或值对象的操作。

  • 领域服务是一种无状态的、跨实体和值对象的行为逻辑。它处理领域中的特定业务操作,不能仅通过单个实体或值对象来实现。

  • 领域服务对于处理复杂的业务行为和跨领域的操作非常有用。

  • 领域服务是一些无状态的对象,用于处理领域中的特定业务逻辑,通常涉及多个实体和值对象的协调操作

10.领域事件(Domain Event)

领域事件表示领域中发生的重要事情,如状态变化、操作完成等。示例:订单创建、支付完成等。

  • 通过使用领域事件,可以将领域中的状态变化通知给其他部分,实现解耦和数据的一致性。
  • 领域事件由领域对象触发,其他部分可以监听并进行相应的处理。

  • 它表示领域中的状态变化,可以被其他部分监听和处理。

  • 领域事件可以用于实现领域间的解耦和通知机制,在处理业务逻辑时具有很大的灵活性。

11.模块(Module)

模块是对领域模型中一组相关领域概念和业务规则的组织。

模块可以由一个或多个聚合根和其他相关对象组成,使领域模型更加清晰和可维护

12.总结

领域模型通过使用领域对象、值对象、聚合根、领域服务和领域事件等概念,描述了业务领域的核心概念和关系。

它提供了一种语言和结构,通过使用领域模型,使开发团队能够更好地理解和描述业务需求将业务逻辑内聚于领域模型中,提高软件的可维护性、可扩展性和可理解性

你可能感兴趣的:(领域驱动设计(DDD),微服务架构,微服务架构,领域驱动设计DDD)