NestJS Request Scoped Multitenancy - PullRequest
       6

NestJS Request Scoped Multitenancy

0 голосов
/ 13 июня 2019

Хотите реализовать мультитенантное решение NestJS, используя новую возможность внедрения запросов в NestJS 6.

Для любой данной услуги я предполагаю, что могу сделать что-то вроде этого:

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

затем в конструкторе определите владельца из запроса, подключитесь к соответствующей базе данных и создайте экземпляры репозиториев для нового подключения.

Мне интересно, это самый простой способ сделать это?

Вместо обновления каждой службы, можно ли переопределить поставщика соединения и область действия , которые , к запросу?

1 Ответ

0 голосов
/ 09 июля 2019

Вот что мы в итоге сделали ...

  1. Создание простого глобального TenancyModule, связанного с областью запроса:

tenancy.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 {}
Внедрение специфичного для запроса 'CONNECTION' в службы модуля, из которых можно получить хранилища:

user.service.ts

...
@Injectable({scope: Scope.REQUEST})
export class UserService {
  private readonly userRepository: Repository<User>;

  constructor(@Inject('CONNECTION') connection) {
    this.userRepository = connection.getRepository(User);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...