是否可以实现“基于列”的多租户,同时避免将tenantId添加到NestJS / TypeORM应用程序中的所有方法?

jmo*_*son 5 design-patterns multi-tenant typeorm nestjs

语境

我们正在使用 NestJS 和 TypeORM(使用 PostgreSQL)构建后端,并确定对我们来说最佳的多租户策略是利用共享数据库/共享模式,其中列(companyId)用于识别所有租户的“租户”(公司)。我们的桌子。

目前的解决方案

我们通过从请求中检索companyId(当前从查询参数中检索,但一旦身份验证到位,它将在 JWT 令牌中)并将 传递给companyId从控制器到服务,然后到存储库。

例如 :

CatsController.create方法从 中获取 companyId@Query('companyId')并将其传递给我们的服务:

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()
  create(
    @Query('companyId') companyId: string,
    @Body() createCatDto: CreateCatDto,
  ) {
    return this.catsService.create(companyId, createCatDto);
  }
}
Run Code Online (Sandbox Code Playgroud)

CatsService.create我们服务上的方法也将其companyId作为参数传递给存储库:

@Injectable()
export class CatsService {
  constructor(
    @InjectRepository(Cat)
    private readonly catRepository: Repository<Cat>,
  ) {}

  create(companyId: string, createCatDto: CreateCatDto) {
    return this.catRepository.save({ ...createCatDto, companyId });
  }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个示例项目,其中包含我们的实现的简化版本,以演示它如何变得复杂并导致大量用于管理所有类方法的 companyId 的样板代码。

https://github.com/jmoyson/multi-tenant-example

问题

虽然这种方法有效,但随着我们继续开发更多模块,很明显这种方法对开发人员不友好,它迫使我们格外谨慎,以确保每个新模块正确实现此策略,以防止出现任何数据分离问题。

所以我的问题是:
是否有一种更有效的方法来实现数据分离,而不必将 companyId 传递给所有方法调用,同时仍然使用我们决定实施的基于列的租户策略?

ps:如果可能,我们希望避免使用请求范围控制器/服务,因为我们的所有请求都需要实现解决方案,并且我们不希望对性能产生负面影响。