【问题标题】:NestJs: Injecting classes without @Injectable()NestJs:在没有 @Injectable() 的情况下注入类
【发布时间】:2021-11-18 04:29:09
【问题描述】:

我希望将某些类/库与 NestJs 分离。这些类被声明为没有@Injectable 装饰器的常规类,并且可能具有进一步的依赖关系。

将这些注入我的 Nest 应用的最佳方式是什么?有没有办法在导入后将它们装饰为可注射的?我试过这样的事情:

import { MyClass } from '@my-library/my-class';
import { MyClassDep } from '@my-library/my-class';

function makeInjectable<T>(target: Type<T>): Type<T> {
  Injectable()(target);
  return target;
}

@Module({
  controllers: [],
  providers: [
    makeInjectable(myClass),
    makeInjectable(myClassDep),
  ],
})
export class UsersModule {}

没有成功。到目前为止,我的解决方案是使用 useFactory 手动提供这些,但这并不理想:

import { MyClass } from '@my-library/my-class';
import { MyClassDep } from '@my-library/my-class';

@Module({
  controllers: [],
  providers: [
    { provide: MyClass, useFactory: (myClassDep: MyClassDep) => new MyClass(myDep), inject: [MyClassDep] },
    { provide: MyClassDep, useFactory: () => new MyClassDep(), inject: [] },
  ],
})
export class UsersModule {}

最好的方法是什么?

【问题讨论】:

    标签: dependency-injection nestjs


    【解决方案1】:

    尝试使用factory providers

    import { MyClass } from '@my-library/my-class';
    import { MyClassDep } from '@my-library/my-class';
    
    function makeInjectable<T>(target: Type<T>): Type<T> {
      return {
        provide: target.constructor.name,
        useFactory: () => new target(),
      };
    }
    
    @Module({
      controllers: [],
      providers: [
        makeInjectable(myClass),
        makeInjectable(myClassDep),
      ],
    })
    export class UsersModule {}
    

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多