Typescript 我可以直接访问DI注入器来用NestJS实例化类吗

Typescript 我可以直接访问DI注入器来用NestJS实例化类吗,typescript,dependency-injection,nestjs,Typescript,Dependency Injection,Nestjs,我想知道是否有一种方法可以访问NestJS中的DI注入器并直接使用它来实例化类。这类似于在特殊情况下直接暴露喷油器的角度或角度 多提供商将解决我的用例。但是,在NestJS中支持多个提供者之前,我将尝试创建一个复合防护装置,将多个防护装置连接在一起,这样我就可以全局应用多个需要访问DI的防护装置。我希望复合保护只接收类型数组,然后使用注入器填充这些类型的对象 我尝试将Injector指定为工厂依赖项,但Nest无法解决它。如果它真的解决了,我不知道如何使用注射器 @Module({ pr

我想知道是否有一种方法可以访问NestJS中的DI注入器并直接使用它来实例化类。这类似于在特殊情况下直接暴露喷油器的角度或角度

多提供商将解决我的用例。但是,在NestJS中支持多个提供者之前,我将尝试创建一个复合防护装置,将多个防护装置连接在一起,这样我就可以全局应用多个需要访问DI的防护装置。我希望复合保护只接收类型数组,然后使用注入器填充这些类型的对象

我尝试将
Injector
指定为工厂依赖项,但Nest无法解决它。如果它真的解决了,我不知道如何使用注射器

@Module({
    providers: [{
        provide: APP_GUARD,
        inject: [Injector],
        useFactory: (injector: Injector) => {
            return new MultiGuard([AuthGuard, PermissionGuard], injector);
        }
    }]
})
class AppModule {}
从'@nestjs/common'导入{CanActivate,ExecutionContext,Type};
导出类MultiGuard实现CanActivate{
建造师(
私有只读保护:类型[],
专用只读注入器:注入器
) {}
async canActivate(上下文:ExecutionContext):承诺{
const-guards=this.guards.map(guard=>{
返回此。注射器。获取(防护);
});
const results=等待承诺。所有(警卫);
返回结果。每个(r=>!!r);
}
}

我最近做了类似的事情,但我没有将防护类型传递给我的“multiguard”,而是在工厂中实例化防护,并传递一组防护实例

这与NestJS执行守卫的方式非常相似。查看
guard consumer.ts
文件

另一个可能的选项是插入一个
模块ref
,并使用它来解析当前模块上下文中的项。只要将另一个模块导入到当前模块中,您也应该能够从该模块获取项目

@Injectable()
export class MyGlobalGuard implements CanActivate {
  public constructor(private readonly moduleRef: ModuleRef) {}

  public async canActivate(context: ExecutionContext): Promise<boolean> {
    // ... resolve items.
    return true;
  }
}

@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: GlobalGuard,
    },
  ],
})
export class AuthModule {}
@Injectable()
导出类MyGlobalGuard实现CanActivate{
公共构造函数(私有只读moduleRef:moduleRef){}
公共异步canActivate(上下文:ExecutionContext):承诺{
//…解决项目。
返回true;
}
}
@模块({
供应商:[
{
提供:APP_GUARD,
useClass:GlobalGuard,
},
],
})
导出类AuthModule{}
@Injectable()
export class GuardsCollection implements CanActivate {
  public constructor(private readonly guards: CanActivate[]) {}

  public async canActivate(context: ExecutionContext): Promise<boolean> {
    for (const guard of this.guards) {
      const result = guard.canActivate(context);
      if (!(await this.pickResult(result))) {
        return false;
      }
    }

    return true;
  }

  private async pickResult(result: boolean | Promise<boolean> | Observable<boolean>): Promise<boolean> {
    if (result instanceof Observable) {
      return result.toPromise();
    }
    return result;
  }
}
@Module({
  providers: [
    {
      provide: APP_GUARD,
      useFactory: (reflector: Reflector) => {
        return new GuardsCollection([
          new (AuthGuard('jwt'))(),
          new RolesGuard(reflector),
        ]);
      },
      inject: [Reflector],
    },
  ],
})
export class AuthModule {}
@Injectable()
export class MyGlobalGuard implements CanActivate {
  public constructor(private readonly moduleRef: ModuleRef) {}

  public async canActivate(context: ExecutionContext): Promise<boolean> {
    // ... resolve items.
    return true;
  }
}

@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: GlobalGuard,
    },
  ],
})
export class AuthModule {}