Appearance
Day 09 - 领域服务(Domain Service)
📖 今日目标
- 理解领域服务(Domain Service)的概念
- 掌握领域服务的适用场景
- 区分领域服务和应用服务
核心概念
什么是领域服务?
领域服务(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. 避免滥用领域服务
领域服务不是"所有逻辑的垃圾桶":
- 能放在实体中的逻辑应该放在实体
- 领域服务用于真正需要协作的场景
面试考点
问题:何时应该使用领域服务?
答案:
使用领域服务的场景:
跨实体的操作:
- 涉及多个聚合的业务逻辑
- 例如:转账需要操作两个账户
复杂的业务规则:
- 不属于任何单个实体的复杂计算
- 例如:复杂的折扣规则
转换操作:
- 需要组合多个领域对象生成新概念
- 例如:从用户和订单生成报表数据
避免:
- 不要把实体方法移到服务中
- 不要创建"上帝服务"包含所有逻辑
实践思考
🎯 思考题:
以下场景是否应该使用领域服务?
- 订单支付(涉及Order、Payment、Inventory)
- 用户修改密码(仅涉及User)
- 库存扣减(涉及Inventory、Product)
📅 学习进度
| Day | 主题 | 状态 |
|---|---|---|
| 01-08 | 战略设计 + 战术基础 | ✅ |
| 09 | 领域服务(Domain Service) | ✅ |
| 10 | 领域事件(Domain Event) | ⬜ |
| ... | ... | ... |
| 30 | 复习与总结 | ⬜ |
