【发布时间】:2019-10-19 21:12:19
【问题描述】:
我想知道是否有一种方法可以访问 NestJS 中的 DI 注入器并直接使用它来实例化类。这类似于 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);
}
}
【问题讨论】:
标签: typescript dependency-injection nestjs