Skip to content

Day 09 - 领域服务(Domain Service)

📖 今日目标

  1. 理解领域服务(Domain Service)的概念
  2. 掌握领域服务的适用场景
  3. 区分领域服务和应用服务

核心概念

什么是领域服务?

领域服务(Domain Service) 用于处理那些不属于任何单个实体或值对象的业务逻辑。当某个业务操作需要多个领域对象协作完成时,使用领域服务。

适用场景:

  • 涉及多个聚合的操作
  • 需要根据领域概念转换数据的操作
  • 实现需要获取依赖的复杂业务规则

关键要点

1. 领域服务 vs 应用服务

对比项领域服务应用服务
职责封装领域业务逻辑协调领域对象、事务
命名业务概念命名用例命名
依赖领域对象、仓储领域服务、仓储

2. 领域服务示例

java
public class PricingService {
    
    public Money calculateOrderTotal(Order order, DiscountPolicy policy) {
        Money subtotal = order.calculateSubtotal();
        Money discount = policy.calculateDiscount(subtotal, order.getCustomer());
        return subtotal.subtract(discount);
    }
}

3. 避免滥用领域服务

领域服务不是"所有逻辑的垃圾桶":

  • 能放在实体中的逻辑应该放在实体
  • 领域服务用于真正需要协作的场景

面试考点

问题:何时应该使用领域服务?

答案:

使用领域服务的场景:

  1. 跨实体的操作

    • 涉及多个聚合的业务逻辑
    • 例如:转账需要操作两个账户
  2. 复杂的业务规则

    • 不属于任何单个实体的复杂计算
    • 例如:复杂的折扣规则
  3. 转换操作

    • 需要组合多个领域对象生成新概念
    • 例如:从用户和订单生成报表数据

避免

  • 不要把实体方法移到服务中
  • 不要创建"上帝服务"包含所有逻辑

实践思考

🎯 思考题

以下场景是否应该使用领域服务?

  1. 订单支付(涉及Order、Payment、Inventory)
  2. 用户修改密码(仅涉及User)
  3. 库存扣减(涉及Inventory、Product)

📅 学习进度

Day主题状态
01-08战略设计 + 战术基础
09领域服务(Domain Service)
10领域事件(Domain Event)
.........
30复习与总结

本文为DDD 30天学习计划第9天内容

📚 导航

| ← Day 08 - 上一章 | Day 10 - 下一章 →

最后更新: