基于实体的服务与仓储的教条
本文批判了软件架构中一种常见但僵化的做法:认为服务层必须直接映射到数据库实体,且每个实体都必须配备对应的仓储。作者指出,这种"实体中心论"往往导致服务缺乏业务语义,沦为简单的CRUD封装。更好的做法是根据业务能力来设计服务接口,让仓储服务于业务逻辑而不被实体绑定。
背景速读
- **Martin Fowler** 是软件工程领域的权威作者,《重构》和《企业应用架构模式》的作者,文中提到的 Catalog 即指后一本书的模式目录。
- **Service Layer** 是企业应用中的一种架构模式:把业务逻辑集中封装在一层“服务”中,而非散落在 UI 或数据库中。该页面正是对该模式的定义说明。
- 文章批评一种常见教条:机械地为每个数据实体(Entity)创建一个对应的 Service 类和一个 Repository 类(如 `User` → `UserService` + `UserRepository`),导致代码像“贫血领域模型”,失去面向对象的意义。
- 关键区分:Service 应处理跨实体的用例或事务边界,而非简单对应实体;Repository 本质上是集合的抽象(如接口),不应与实体一一绑定。
- 这一讨论的背景是 Java 生态中 Spring 框架的流行:`@Service` 和 `@Repository` 注解常被开发者误用为脚手架模板,忽略其架构意图。