Мне интересно, есть ли способ получить доступ к 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);
}
}