DDD聚合、领域服务、应用服务

一、聚合(Aggregate)

在DDD中,聚合被视为设计和实现领域模型的基础,它提供了一种清晰的方式来组织领域对象,并定义了领域对象之间的关系和行为。

简单来说就是为了实现“高内聚,低耦合”。

高内聚

高内聚是指模块内部各个元素之间相关性非常高,彼此之间联系紧密,同时与外部的联系尽可能的小。

优点:

  1. 提高代码重用性:高内聚的模块代码可以被其他模块重用,减少代码的重复编写。

  2. 提高模块的可维护性:高内聚的模块可以更容易地进行维护和修改,因为模块内部的代码联系紧密,修改一个模块不会影响其他模块。

  3. 提高代码的可读性:高内聚的模块代码易于阅读和理解,因为它们的功能单一,逻辑清晰,易于追踪和理解。

  4. 降低耦合度:高内聚的模块之间耦合度低,各模块之间变化不会相互影响,不会带来连锁反应,从而提高软件系统的稳定性。

低耦合

指系统中各个组件或模块的耦合度程度较低,即它们之间相互依赖性较小。

优点:

  1. 提高代码的可扩展性:由于模块之间相互独立,新增模块时只需要考虑如何与现有模块进行连接,并不需要对原有的模块进行修改或重构,从而降低了扩展的成本。

  2. 提高代码的可测试性:低耦合的模块能够更容易地进行单元测试,从而提高代码的质量和可靠性。

高内聚与低耦合也是微服务的一个核心。 

聚合根(Aggregate Root)

将关系紧密的实体放到一个聚合中,每个聚合中有一个实体作为聚合根,所有对于聚合内对象的访问都通过聚合根来进行,外部对象只能持有对聚合根的引用,聚合根不仅仅是实体,还是所在聚合的管理者。

聚合根具有以下特征:

  • 聚合根代表一组实体和值对象的集合,它们具有一定的业务意义,并且需要以事务性的方式进行一致性管理。
  • 聚合根提供了一个单一的入口点,在整个系统中只有它才能被直接访问和修改,这有助于确保整个聚合的一致性。
  • 聚合根的标识符(ID)可以唯一地标识整个聚合,在应用中可以用于查询和访问聚合。

聚合的划分

在进行聚合的划分时,需要考虑以下几个因素:

  1. 业务领域:聚合应该尽可能反映业务领域中的真实概念。

  2. 明确边界:聚合边界应该明确,避免与其他聚合产生重叠,保证聚合间的独立性和可重用性,实体是否是整体和部分的关系。

  3. 业务操作:聚合应该考虑业务操作的一致性和原子性,避免在操作过程中出现数据的不一致性。

  4. 性能考虑:聚合的大小应该在一定范围内,避免太大或太小,影响系统的性能。

聚合中,真正的难点在于对聚合的划分,在不同的业务逻辑当中,实体可能划分为聚合也可能划分为聚合根,也正因此,聚合太过于灵活,不好对其具体划分,小聚合有助于进行微服务的拆分。

二、领域服务与应用服务

2.1、领域服务

领域模型是对业务领域的概念和规则进行抽象和建模,它将业务领域的要素转化为软件构件。通过领域模型的建立,可以更好地理解业务流程。

领域模型一般包括以下几个部分:

  • 实体(Entity):表示领域中的对象或事物,具有属性和行为。
  • 值对象(Value Object):表示领域中的值,比如时间、金额、地址等,一般没有自己的标识,也不会发生变化。
  • 聚合(Aggregate):由一组相关的实体和值对象组成,形成一个有边界的整体,同时具有一些内部的约束和规则。
  • 领域服务(Domain Service):表示领域中的某些特定行为,比如计算、验证等。
  • 领域事件(Domain Event):表示领域中发生的一些重要事件,比如订单被创建、库存不足等。

领域模型通常用作以下几个方面:

  1. 确定业务需求:通过领域模型,开发人员能够更好地理解业务领域中的各个对象之间的关系和行为,从而更好地识别并满足业务需求。

  2. 指导软件设计:领域模型可以指导软件设计,尤其是在使用面向对象编程语言进行开发时。它可以帮助开发人员创建高质量、可维护和可扩展的软件系统。

  3. 驱动开发过程:领域模型可以成为开发过程中的一个指导原则,而不只是一个可执行代码的设计或静态文档。它可以帮助开发团队明确应用程序的规范及实现,提高开发效率。

  4. 支持测试:领域模型可以帮助测试人员更好地理解业务需求和系统功能,从而更有效地规划和执行测试工作。

对于聚合内的业务,编写在领域服务中。

2.2、应用服务

应用服务通常负责建立领域模型和基础设施之间的联系,执行用例和协调领域对象的操作。它不包含任何业务逻辑和状态,而是将请求委托给领域模型和基础设施,然后将结果返回给客户端。

应用服务通常被用于以下方面:

  1. 处理用户请求和响应:应用服务可以接收来自用户界面的请求,并调用领域层的服务和领域对象进行处理和响应,然后将结果返回给用户界面。

  2. 调用多个领域对象:应用服务可以协调多个领域对象之间的交互,并确保它们按照正确的顺序执行。

  3. 实现业务流程:应用服务可以实现业务流程,如订单处理等等,通过协调多个领域对象和服务的实现完成。

  4. 事务处理:应用服务可以管理事务的边界和范围,并确保所有操作都能成功或者回滚。

应用服务是业务逻辑和持久化层之间的桥梁,负责协调领域对象和基础设施服务(如数据库、消息队列等)。

对于聚合外的业务,编写在应用服务中。

 

你可能感兴趣的:(架构,设计模式,微服务,DDD)