循环依赖是否可接受?UsersService帖子校验实现方式选型疑问
问题解答
优先用PostsService的方法,别直接调用Prisma
从代码维护和职责划分的角度,肯定优先复用PostsService.find来检查帖子状态,原因很简单:
- 职责归位:帖子的查询、校验本来就是PostsService该管的事。以后要是PostsService的find要加逻辑——比如过滤掉已删除的帖子、加权限校验——UsersService不用改一行代码就能享受到这些更新,不用重复写相同的Prisma查询。
- 避免重复造轮子:所有查帖子的操作都走同一个入口,能保证逻辑一致,减少因为不同地方写不同查询导致的bug。
循环依赖是风险,不是正常情况
你担心的循环依赖确实得警惕,这种两个服务互相调用的情况,本质是职责划分没理清,不属于合理的设计。可以这么解决:
- 抽基础查询层:把帖子的基础查询逻辑(比如按ID查帖子)单独拎到一个
PostRepository类里,让UsersService和PostsService都依赖这个Repository,而不是互相依赖。 - 加个协调层:搞一个专门处理用户和帖子关联的服务,比如
UserPostLinkService,让它来调用UsersService和PostsService,两个基础服务就不用直接打交道了。 - 框架临时救场:如果用的是NestJS,虽然能用
forwardRef绕开循环依赖,但这只是临时办法,长远来看还是得把职责掰清楚,别留依赖环。
顺便提下你代码里的小问题
你当前createUser里的判断逻辑好像反了?如果是要确保用户关联的帖子存在,应该是“找不到帖子时抛错”,而不是“找到帖子就抛PostAlreadyAssignedError”;如果是要检查帖子有没有被其他用户占了,那得在PostsService的find里带上用户关联信息才行。
内容的提问来源于stack exchange,提问作者eugenedrvnk
相关产品推荐
相关产品推荐

