整洁架构中实体是否需包含游标?如何规避领域层请求响应模型
整洁架构下游标处理方案
实体不应持有游标属性
游标是分页查询的技术实现细节,和领域实体的核心业务属性完全无关。领域实体的职责是封装业务规则、表达核心业务概念(比如Game实体应该只包含游戏ID、名称、状态这些和业务直接相关的属性),把游标塞进实体里会污染领域模型,违背整洁架构中领域层独立于技术细节的原则。
避免领域层引入请求响应模型的游标传递方案
不用在领域层创建请求/响应实体,通过以下三层分离的方式处理:
1. 领域层定义分页契约
- 定义分页查询参数对象:比如
GamePaginationQuery,包含nextCursor、previousCursor、pageSize等分页控制字段。这个对象是领域层内部用来描述分页查询需求的契约,不是对外的API请求模型。 - 定义通用分页结果容器:比如
PaginatedResult<T>,结构示例如下:
这个容器用来承载分页查询的结果,属于领域层的通用组件,和外部API响应格式解耦。class PaginatedResult<T> { List<T> items; String nextCursor; String previousCursor; }
2. 数据层实现分页查询
Repository接口(属于领域层定义)新增方法,接收GamePaginationQuery参数,返回PaginatedResult<Game>。数据层的实现(比如数据库查询)根据游标参数执行分页逻辑,生成对应的游标值(比如基于最后一条记录的ID、创建时间等),封装进PaginatedResult返回。
3. 应用层做格式转换
应用层作为领域层和适配器层的中间层,负责:
- 接收适配器层(比如API网关)传来的请求参数(比如从Proto请求里提取cursor),转换为领域层的
GamePaginationQuery。 - 调用领域服务或Repository获取
PaginatedResult<Game>。 - 将
PaginatedResult里的Game实体转换为Proto的Game消息,同时把nextCursor、previousCursor直接赋值给ListGamesResponse对应的字段。
这样一来,领域层完全不依赖外部的Proto请求/响应模型,只处理核心的业务逻辑和分页契约,符合整洁架构的分层原则。
内容的提问来源于stack exchange,提问作者anonymous-dev
相关产品推荐
相关产品推荐

