multi-tenant之NestJS 请求多个数据库的范围 Multi-Tenancy

Terrylee 阅读:51 2024-12-31 21:38:35 评论:0

希望使用 NestJS 6 的新请求注入(inject)范围功能实现 Multi-Tenancy NestJS 解决方案。

对于任何给定的服务,我认为我可以做这样的事情:

@Injectable({scope: Scope.REQUEST}) 
export class ReportService implements OnModuleInit { ... } 

然后,在构造函数中,根据请求确定租户,连接到适当的数据库,并为新连接实例化存储库。

我想知道这是否是最直接的方法?

除了更新每个服务之外,是否可以覆盖连接提供者并将其范围限定为请求?

请您参考如下方法:

这就是我们最终要做的...

  • 创建一个简单的全局 TenancyModule绑定(bind)到请求范围:

  • 租户.module.ts
    import { Global, Module, Scope } from '@nestjs/common'; 
    import { REQUEST } from '@nestjs/core'; 
    import { getConnection } from 'typeorm'; 
     
    const connectionFactory = { 
      provide: 'CONNECTION', 
      scope: Scope.REQUEST, 
      useFactory: (req) => { 
        const tenant = someMethodToDetermineTenantFromHost(req.headers.host); 
        return getConnection(tenant); 
      }, 
      inject: [REQUEST], 
    }; 
     
    @Global() 
    @Module({ 
      providers: [connectionFactory], 
      exports: ['CONNECTION'], 
    }) 
    export class TenancyModule {} 
    
  • 注入(inject)特定请求 'CONNECTION'进入模块服务,从中检索存储库:

  • 用户服务.ts
    ... 
    @Injectable({scope: Scope.REQUEST}) 
    export class UserService { 
      private readonly userRepository: Repository<User>; 
     
      constructor(@Inject('CONNECTION') connection) { 
        this.userRepository = connection.getRepository(User); 
      } 
    


    标签:数据库
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号