【问题标题】:Is circular dependency acceptable?循环依赖是否可以接受?
【发布时间】:2022-12-11 11:53:45
【问题描述】:

我有一个用户表和一个帖子表。
没有至少一个帖子,用户就不可能存在。
我有下一个“UsersService”:

class CreateUserDto {
  firtname: string;
  lastname: string;
  postIdToAssign: number;
}

class UsersService {
  constructor(
    private readonly postsService: PostsService,
    private readonly prisma: PrismaService,
  ) {}
  
  createUser(dto: CreateUserDto) {
    if (this.postsService.find(postsIdToAssign) {
      throw new PostAlreadyAssignedError();
    }   
    
    return this.prisma.user.create({
      data: dto,
    })
  }
}

为了检查帖子是否存在,我应该使用“postsService.find”方法(在上面的代码中),还是直接执行

if (this.prisma.post.findFirst({where: {id: postIdToAssign}}) // then throw Error

这里主要关心的是我是否应该使用 PostsService 的方法,因为如果使用 PostsService 方法——在某些情况下“PostsService”可能需要使用一些“UsersService”方法,我们将得到循环依赖。或者这是正常情况?

【问题讨论】:

    标签: typescript rest nestjs prisma


    【解决方案1】:

    其实有两个顾虑。

    1. 代码中的循环依赖导致打字稿中的编译问题。
    2. 架构/逻辑中的循环依赖通常会导致混乱。

      有一种简单的方法可以解决这两个问题。我们只是机械地打破了编译中的循环依赖。为了符合逻辑,我们需要确定主要/次要关系。例如,在用户和帖子的情况下,我会将用户设置为主要的,将帖子设置为次要的。对于我们在帖子中需要的用户的那些东西,我们定义接口并将其放在单独的文件中(如果没有其他人需要它,甚至可以放在帖子文件中)。对用户文件中帖子功能的引用保持不变。为了在帖子中引用用户功能,我们现在有了界面。循环依赖问题已修复。

      有趣的是,系统地应用这种类似机械和冗长的方法,我们得到了代码的洋葱结构。我没有说它与各种架构书籍中描述的是同一件事,但我非常喜欢这种方法,因为它非常简单,不需要任何哲学。

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 2015-06-24
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2022-12-20
      • 2010-09-18
      相关资源
      最近更新 更多