4.7领域服务设计

分类: DDD领域驱动设计实战

领域服务设计

领域服务封装了不属于任何实体或值对象的领域逻辑。合理设计领域服务是 DDD 设计的重要部分。本节将学习如何设计领域服务。

本节将学习:领域服务识别、领域服务实现、与应用服务区别,以及业务规则封装。

领域服务识别

识别原则

领域服务的识别原则:

  • 操作涉及多个聚合
  • 不属于任何实体或值对象
  • 包含重要的领域逻辑

示例:订单计算服务

package com.example.ecommerce.domain.service; import com.example.ecommerce.domain.model.Order; import com.example.ecommerce.domain.model.OrderItem; import org.springframework.stereotype.Service; @Service public class OrderCalculationService { public void calculateTotal(Order order) { Money total = Money.ZERO; for (OrderItem item : order.getItems()) { Money subtotal = item.getPrice().multiply(item.getQuantity()); total = total.add(subtotal); } order.setTotalAmount(total); } }

领域服务实现

无状态设计

领域服务应该是无状态的:

@Service public class OrderDomainService { public void validateOrder(Order order) { // 验证订单的业务规则 if (order.getItems().isEmpty()) { throw new BusinessException("Order must have at least one item"); } if (order.getTotalAmount().isNegative()) { throw new BusinessException("Order total cannot be negative"); } } }

与应用服务区别

区别对比

领域服务 vs 应用服务:

  • 领域服务:封装领域逻辑,无状态
  • 应用服务:协调领域对象,管理事务

业务规则封装

规则封装示例

@Service public class InventoryDomainService { public void checkStock(Product product, Integer quantity) { if (product.getStock() < quantity) { throw new InsufficientStockException( "Insufficient stock for product: " + product.getName() ); } } }

官方资源

本节小结

在本节中,我们学习了:

第一个是领域服务识别。 识别需要封装为领域服务的逻辑。

第二个是领域服务实现。 实现无状态的领域服务。

第三个是与应用服务区别。 理解领域服务和应用服务的区别。

第四个是业务规则封装。 在领域服务中封装业务规则。

这就是领域服务设计。领域服务封装了重要的领域逻辑,是 DDD 设计的重要组成部分。

在下一节,我们将学习如何实现应用服务层。