You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仓储层create方法应返回什么类型?返回实体是否违反CQRS模式?

问题核心结论

仓储层的create()方法返回实体不违反CQRS模式,你遇到的问题本质是对CQRS的规则适用范围存在误解。

规则澄清

CQRS要求的「Command不返回值」约束,仅针对对外暴露的应用层Command Handler接口,核心目的是严格隔离命令侧(写操作)和查询侧(读操作)的职责边界,避免业务逻辑在两侧重复实现。该规则完全不限制命令侧内部各个组件的方法返回值。

两种可落地的解决方案

方案1:直接调整仓储create()方法返回实体(最常用)

这是行业内的通用实践:

  • 命令侧内部需要获取ORM生成的实体ID/完整实体是高频场景,除了你当前需要关联父分类的需求外,后续发送领域事件、记录操作日志等场景也都需要用到生成后的实体信息
  • 只要你没有把这个返回值直接透传到Command Handler的对外返回结果中,就完全符合CQRS的规范要求

方案2:前置生成实体ID(适合团队严格要求仓储create()必须返回void的场景)

如果你的团队规范强制要求仓储写方法不能有返回值,可以绕开ORM生成ID的限制:

  • 引入独立的ID生成器(如雪花算法、UUID),在实例化实体对象时就手动生成并赋值ID,不需要依赖ORM框架在保存时生成
  • 你可以先完成子分类实体的实例化、父分类ID的赋值,再调用create()方法保存即可,不需要依赖仓储的返回值获取ID

补充注意事项

如果后续需要把新建分类的ID返回给客户端,不要直接在Command Handler中返回该值,遵循CQRS规范的处理方式是:客户端提交Command之后,主动调用对应的查询接口获取最新数据,或是服务端在Command执行完成后通过事件通知的方式推送新生成的ID给客户端。


内容的提问来源于stack exchange,提问作者Ngọc Nguyễn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:27:04