Могу ли я получить доступ к DI-инжектору напрямую для создания экземпляров классов с помощью NestJS - PullRequest
1 голос
/ 20 сентября 2019

Мне интересно, есть ли способ получить доступ к DI-инжектору в NestJS и использовать его напрямую для создания экземпляров классов.Это будет похоже на то, как Angular или Inversify выставляют инжектор напрямую для использования в особых случаях.

Множественные провайдеры решат мой вариант использования.Но до тех пор, пока в NestJS не поддерживаются мульти-провайдеры, я вместо этого пытаюсь создать составную охрану, которая бы связала несколько охранников вместе, чтобы я мог глобально применить несколько охранников, которым нужен доступ к DI.Я хочу, чтобы составной охранник получал только массив типов, а затем использовал инжектор для заполнения объектов для этих типов.

Я пытался указать Injector как заводскую зависимость, но Nest не смог ее разрешить.И если бы это действительно помогло, я не знаю, как бы я использовал инжектор.

@Module({
    providers: [{
        provide: APP_GUARD,
        inject: [Injector],
        useFactory: (injector: Injector) => {
            return new MultiGuard([AuthGuard, PermissionGuard], injector);
        }
    }]
})
class AppModule {}
import { CanActivate, ExecutionContext, Type } from '@nestjs/common';

export class MultiGuard implements CanActivate {
    constructor(
        private readonly guards: Type<CanActivate>[],
        private readonly injector: Injector
    ) {}

    async canActivate(context: ExecutionContext): Promise<boolean> {
        const guards = this.guards.map(guard => {
            return this.injector.get(guard);
        });

        const results = await Promise.all(guards);

        return results.every(r => !!r);
    }
}

...