什么是DDD设计模型?

DDD(领域驱动设计)是一种软件设计模型,它将软件系统的结构划分为三个不同的领域:数据领域、业务领域和应用领域。数据领域负责存储和管理系统中的数据,业务领域负责定义系统中的业务规则和行为,应用领域负责处理用户的请求和操作。

在DDD设计模型中,系统的架构和设计都是围绕这三个领域展开的。每个领域都有自己的一套概念、实体、值对象和聚合根,这些概念和实体都是针对特定领域的问题和需求进行设计的。同时,每个领域之间都存在着一定的关联和依赖,这些关联和依赖可以通过领域之间的聚合和关联来实现。

在DDD设计模型中,聚合根是一个非常重要的概念。聚合根是一个领域对象的核心概念,它代表了整个聚合的行为和状态。聚合根可以包含一些相关的实体对象,这些实体对象都是聚合根的一部分,它们共同组成了聚合的状态。聚合根还可以有自己的行为,这些行为是针对整个聚合的,而不是针对单个实体对象的。

总的来说,DDD设计模型是一种强调领域驱动的设计模型,它将软件系统的结构划分为三个不同的领域,并围绕这些领域进行设计和架构。通过聚合根和领域之间的关联和依赖,DDD设计模型可以帮助我们更好地理解和管理复杂的软件系统。

能否举一个简单例子告诉我什么是DDD?

假设我们正在设计一个在线书店的系统。在这个系统中,我们可以有以下三个领域:

  • 数据领域:用于存储书籍的信息,包括书名、作者、出版社、价格等等。
  • 业务领域:用于定义书店的业务规则和行为,包括书籍的购买、退货、促销等等。
  • 应用领域:用于处理用户的请求和操作,包括搜索书籍、添加书籍到购物车、结算等等。

在这个系统中,我们可以定义一个书籍实体对象,它包含书籍的基本信息,例如书名、作者、出版社、价格等等。我们还可以定义一个购物车实体对象,它包含了用户购物车中的书籍信息。此外,我们还可以定义一个订单实体对象,它包含了用户的订单信息,例如订单金额、优惠等等。

在业务领域中,我们可以定义一些业务规则,例如书籍的促销规则、退货规则等等。我们还可以定义一些业务行为,例如添加书籍到购物车、从购物车中删除书籍、确认订单等等。

在应用领域中,我们可以定义一些聚合,例如搜索聚合、购物车聚合、订单聚合等等。每个聚合都包含了一些相关的实体对象,例如搜索聚合可能包含了书籍实体对象、促销规则实体对象等等。每个聚合还有自己的行为,例如搜索聚合可能包含了搜索书籍的行为、添加书籍到购物车的行为等等。

通过以上的设计,我们可以构建一个在线书店的系统,它可以支持用户的购买

DDD的作用

  • 领域模型确保了我们的软件的业务逻辑都在一个模型中,都在一个地方;这样对提高软件的可维护性,业务可理解性以及可重用性方面都有很好的帮助;
  • 领域模型能够帮助开发人员相对平滑地将领域知识转化为软件构造;
  • 领域模型贯穿软件分析、设计,以及开发的整个过程;领域专家、设计人员、开发人员通过领域模型进行交流,彼此共享知识与信息;

    基本概念

    实体(Entity)

  • 实体就是领域中需要唯一标识的领域概念。
  • 实体有生命周期
  • 不应该给实体定义太多的属性或行为,而应该寻找关联,将属性或行为转移到其他关联的实体或值对象上
  • 比如入驻申请,有申请Id表示

    值对象(Value Object)

  • 值对象是领域中不具有唯一标识的领域概念。也就是说我们不关心对象是哪个,而只关心对象是什么。
  • 所有属性都是只读的,所以可以被安全的共享
  • 比如门店地址,有省市区表示

    领域服务(Domain Service)

  • 领域中的一些概念不太适合建模为对象,即归类到实体对象或值对象,因为它们本质上就是一些操作,一些动作,而不是事物。这些操作或动作往往会涉及到多个领域对象,并且需要协调这些领域对象共同完成这个操作或动作
  • 需要强调的是领域服务是无状态的,它存在的意义就是协调领域对象共完成某个操作
  • 领域服务还有一个很重要的功能就是可以避免领域逻辑泄露到应用层
  • 比如:MerchantEnterApplyService,MerchantEnterApplyAuditService 等

    我觉得模型(实体)与服务(场景)是对领域的一种划分,\ 模型关注领域的个体行为,场景关注领域的群体行为,\ 模型关注领域的静态结构,场景关注领域的动态功能。这也符合了现实中出现的各种现象,有动有静,有独立有协作。

    聚合及聚合根(Aggregate,Aggregate Root)

  • 聚合是领域对象以一定的业务逻辑为边界,将相关对象定义为一个组或一个整体。
  • 聚合根是聚合的根节点,它是一个实体对象,负责协调和管理整个聚合内的所有对象。
  • 比如 MerchantEnterApply 是聚合根,它包含了很多实体对象,如 MerchantBrandInfo,MerchantPoi 等。
  • 如果一个聚合只有一个实体,那么这个实体就是聚合根;如果一个聚合有多个实体,那么这些实体都是聚合内的对象,只有聚合根是聚合的根节点。

    工厂方法(Factory Method)

    有时创建一个领域对象是一件比较复杂的事情,不仅仅是简单的new操作。正如对象封装了内部实现一样(我们无需知道对象的内部实现就可以使用对象的行为),工厂则是用来封装创建一个复杂对象尤其是聚合时所需的知识

    仓储(Repository)

  • 仓储是领域对象和数据持久化层之间的一个接口,用于封装对持久化对象的获取、添加、删除等操作。
  • 仓储里面存放的对象一定是聚合

    领域事件(Domain Event)

界限上下文

一个大型系统中,对不同业务领域进行划分,并明确每个领域的边界和范围。每个界限上下文内部拥有独立的领域模型, 上下文之间通过明确的接口活消息进行交互

界限上下文的关键点

  1. 独立性
  2. 每个界限上下文都有自己独立的领域模型和业务逻辑,不依赖于其他上下文
  3. 独立的领域模型意味着在同一系统中,不同的上下文可能会对同一概念有不同的定义。
  4. 明确的边界
  5. 上下文边界明确区分了不同领域的职责范围,避免了模型的混淆和复杂化。
  6. 边界通过接口或协议进行交互,确保上下文之间的低耦合
  7. 一致性和完整性
  8. 保持上下文内部的数据一致性,确保业务规则和逻辑的完整性。
  9. 通过上下文边界,防止数据和业务逻辑的泄漏

DDD 分层设计

领域分层设计图

应用层服务

  1. 获取输入(如一个XML请求);
  2. 发送消息给领域层服务,要求其实现转帐的业务逻辑;
  3. 领域层服务处理成功,则调用基础层服务发送Email通知;

    领域层服务

  4. 获取源帐号和目标帐号,分别通知源帐号和目标帐号进行扣除金额和增加金额的操作;
  5. 提供返回结果给应用层;

    基础层服务

  6. 按照应用层的请求,发送Email通知;

所以,从上面的例子中可以清晰的看出,每种服务的职责;

对于不会影响领域层中领域对象状态的查询功能,可以直接通过仓储查询出所需要的数据

results matching ""

    No results matching ""