Skip to content

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 APIWeb 细节留在 api / web

相关章节 ​