Nest.js中的multiInject

时间:2018-10-19 15:31:54

标签: javascript node.js nestjs inversifyjs

在Inversify.js中,有multiInject装饰器使我们可以将多个对象作为数组注入。该数组中所有对象的依赖关系也已解决。

在Nest.js中有什么方法可以实现这一目标吗?

2 个答案:

答案 0 :(得分:3)

没有直接等效于multiInject的内容。不过,您可以为数组提供custom provider

示例

尝试在此sandbox中使用示例。

注射剂

让我们假设您有多个实现接口@Injectable的{​​{1}}类。

Animal

模块

export interface Animal { makeSound(): string; } @Injectable() export class Cat implements Animal { makeSound(): string { return 'Meow!'; } } @Injectable() export class Dog implements Animal { makeSound(): string { return 'Woof!'; } } Cat都在您的模块中可用(在那里提供或从另一个模块导入)。现在,您为Dog的数组创建自定义标记:

Animal

控制器

然后您可以像这样在控制器中注入和使用providers: [ Cat, Dog, { provide: 'MyAnimals', useFactory: (cat, dog) => [cat, dog], inject: [Cat, Dog], }, ], 数组:

Animal

只要constructor(@Inject('MyAnimals') private animals: Animal[]) { } @Get() async get() { return this.animals.map(a => a.makeSound()).join(' and '); } 在模块中(导入/提供)有Dog,只要Toy还具有诸如Toy之类的其他依赖项,这也将起作用:

@Injectable()
export class Dog implements Animal {
  constructor(private toy: Toy) {
  }
  makeSound(): string {
    this.toy.play();
    return 'Woof!';
  }
}

答案 1 :(得分:0)

只需对@kim-kern 的出色解决方案稍作调整,您就可以使用该解决方案,但要避免添加新条目的少量开销......

替换

providers: [
    Cat,
    Dog,
    {
      provide: 'MyAnimals',
      useFactory: (cat, dog) => [cat, dog],
      inject: [Cat, Dog],
    },
  ],

providers: [
    Cat,
    Dog,
    {
      provide: 'MyAnimals',
      useFactory: (...animals: Animal[]) => animals,
      inject: [Cat, Dog],
    },
  ],

这只是次要,但不必为每个新添加的3 个地方添加一个新的,而是减少到2。当您有几个时累加并减少出错的机会。

此外,nest 团队正在努力使这更容易,您可以通过这个 github 问题进行跟踪:https://github.com/nestjs/nest/issues/770