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. 事务处理:应用服务可以管理事务的边界和范围,并确保所有操作都能成功或者回滚。

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

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

 

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 领域模型:领域模型是指在领域驱动设计(DDD)中,对于一个特定的领域,通过对其进行建模,抽象出该领域的实体、值对象、聚合和关系等,以实现对该领域的深入理解和分析。 举例:针对在线购物领域,建立领域模型包括用户、订单、购物车、商品等实体,以及价格、数量等值对象。 2. 限界上下文:限界上下文是指在DDD中,为了更好地实现领域模型的划分和边界确定,将一个领域按照其边界进行划分,并确定各个部分之间的交互方式和接口规范。 举例:对于在线购物领域,可以将用户管理、订单管理、商品管理等不同部分划分成不同的限界上下文,以便更好地管理和维护。 3. 领域事件:领域事件是指在DDD中,对于领域模型中的实体、值对象、关系等发生的特定事件进行定义和描述,以实现领域模型的更新和维护。 举例:在在线购物领域中,当用户提交订单时,就会发生订单生成事件,该事件包括订单号、商品信息、价格等。 4. 聚合根:聚合根是指在DDD中,将一组实体和值对象进行聚合,以实现更好的领域模型设计和管理。 举例:在在线购物领域中,订单可以作为一个聚合根,包括用户信息、商品信息、价格、数量等实体和值对象。 5. 领域服务领域服务是指在DDD中,对于一组特定的领域模型,提供对应的服务接口和操作方式,以实现对该领域的管理和操作。 举例:在在线购物领域中,可以提供订单管理、用户管理、商品管理等领域服务,以便更好地管理和维护。 6. 值对象:值对象是指在DDD中,对于领域模型中的某个特定属性或者组合属性,进行抽象和封装,以实现更好的数据管理和应用。 举例:在在线购物领域中,价格、数量等都可以作为值对象,以实现更好的数据管理和应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值