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 领域服务:https://www.domainlanguage.com/ddd/
本节小结
在本节中,我们学习了:
第一个是领域服务识别。 识别需要封装为领域服务的逻辑。
第二个是领域服务实现。 实现无状态的领域服务。
第三个是与应用服务区别。 理解领域服务和应用服务的区别。
第四个是业务规则封装。 在领域服务中封装业务规则。
这就是领域服务设计。领域服务封装了重要的领域逻辑,是 DDD 设计的重要组成部分。
在下一节,我们将学习如何实现应用服务层。