Service
职责
service 包承载业务逻辑与编排,典型职责包括:
- 校验业务规则、组装领域对象
- 调用本模块
repository/mapper读写数据 - 通过 Port 调用其他 Bundle 或外部系统
- 发布 dispatch 领域事件
- 划分事务边界(
@Transactional)
Service 是 Controller 与持久化层之间的主要协作层;复杂流程可拆为 *Orchestrator、*FacadeService、*QueryService 等命名类,按子域分子包(如 service/items/、service/wxapp/)。
放置位置
ecshopx-<domain>/src/main/java/cn/shopex/ecshopx/<domain>/service/
├── items/ # 商品子域
├── wxapp/ # 小程序相关
├── dto/ # Service 层传输对象(非表实体)
└── ...真实类路径示例
商品列表门面 — goods
cn.shopex.ecshopx.goods.service.items.GoodsItemsListFacadeService- 源文件:
ecshopx-goods/src/main/java/cn/shopex/ecshopx/goods/service/items/GoodsItemsListFacadeService.java - 被
api.admin.v1.ItemsController注入,聚合列表查询与 enrichment 逻辑
订单定时消费 — orders
cn.shopex.ecshopx.orders.service.NormalOrderCronService- 源文件:
ecshopx-orders/src/main/java/cn/shopex/ecshopx/orders/service/NormalOrderCronService.java - 被
cron.ScheduleConsumptionOrdersHandler调用,执行订单定时任务业务
禁止事项
| 禁止 | 说明 |
|---|---|
Service 直接依赖其他 Bundle 的 mapper / domain 实体做写操作 | 通过 Port 接口或事件解耦 |
| 在 Service 中拼接 HTTP 响应结构 | 返回领域 DTO 或 ApiResult 所需数据,由 Controller 封装 |
| 将 SQL 字符串或 MyBatis XML 逻辑散落在多个 Service | 复杂查询收口至 repository 或 Mapper 自定义方法 |
| 无边界地创建「上帝 Service」 | 按子域拆包,单类职责保持可测试 |
| 在 Service 层处理 Servlet API | Web 细节留在 api / web |
相关章节
- Controller
- Mapper / Domain
- Bundle —
integration、dispatch
