Prompts-MCP 686 skills · ai / design / design-pattern / framework / fundamentals / habit / lang / tech-selection /mcp/sse
design-pattern design-pattern/ddd-layering/service-orchestration.md medium

ddd-service-orchestration

Service 编排层 — 注释驱动的流水线方法。Use when 写 Python 后端代码 / 评审涉及 `service-orchestration` 的 PR。

service编排流水线
paths
  • backend/services/**/*.py
  • py/services/**/*.py

DDD · Service 编排

规则

Service 负责业务流程编排:校验 → 加载领域对象 → 调用领域方法 → 持久化 → 返回。

流水线方法结构

async def submit_order(self, req: SubmitOrderReq, user_id: int) -> OrderResp:
    """提交订单 — 6 步编排"""

    # 1. 参数与权限校验
    OrderValidator.validate_submit(req)

    # 2. 加载购物车并校验库存
    cart = await self._load_cart_with_stock_check(req.cart_id, user_id)

    # 3. 计算最终价格(含优惠、积分)
    price = self._price_calculator.calculate(cart, req.coupon, req.points)

    # 4. 扣库存
    await self._inventory.deduct(cart.items)

    # 5. 生成订单
    order = Order.from_cart(cart, price, req)
    await self._repo.save(order)

    # 6. 触发支付
    await self._payment.charge(order)

    logger.info(f"提交订单完成 - order_id={order.id} user_id={user_id} amount={price.total}")
    return OrderAdapter.to_resp(order)

注释驱动

每步前一行中文注释,读注释即懂全流程。Reviewer 看注释能判断是否合理。

五个抽象(独立成类 / 函数)

抽象 何时抽 命名
Validator 参数校验 ≥ 3 行 OrderValidator.validate_*
Converter 字段映射 ≥ 5 行 OrderConverter.to_* / OrderAdapter.to_*
PriceCalculator 业务计算独立 注入到 Service
Repository 持久化 OrderRepository.save
GatewayService 调外部 API PaymentService.charge

Service 主流程只调用,不内嵌。

反例

# ❌ 编排里堆 50 行字段映射
async def submit_order(req, user_id):
    cart = await Cart.filter(id=req.cart_id).first()
    ...
    # 50 行字段映射
    result = {
        "id": order.id,
        "title": order.title,
        ...   # 50 个字段
    }
    return result

# ✅ 抽 Adapter
result = OrderAdapter.to_resp(order)
return result

异常处理三件套

async def submit_order(req, user_id):
    try:
        # ... 6 步编排
        return result
    except ApiException:
        raise   # 业务异常透传
    except Exception as e:
        logger.exception(f"提交订单失败 - user_id={user_id}: {e}")
        raise ApiException(msg="提交失败,请重试")

详见 ../../lang/python/error-handling/api-exception.md

自检

  • [ ] Service 方法 ≤ 30 行?
  • [ ] 每步有中文注释?
  • [ ] 参数校验 / 字段映射 / 计算独立抽出?
  • [ ] 不直接写 SQL(通过 Repository)?
  • [ ] 异常三件套完整?

相关