Javascript Nest.js中的多重注入
在Inversify.js中有Javascript Nest.js中的多重注入,javascript,node.js,nestjs,inversifyjs,Javascript,Node.js,Nestjs,Inversifyjs,在Inversify.js中有multiInjectdecorator,允许我们将多个对象作为数组注入。此数组中所有对象的依赖关系也已解决 在Nest.js中有什么方法可以实现这一点吗?没有直接等同于多注入的方法。您可以为阵列提供以下选项: 例子 试试这个例子吧 注射剂 假设您有多个@可注射的类实现接口Animal export interface Animal { makeSound(): string; } @Injectable() export class Cat implemen
multiInject
decorator,允许我们将多个对象作为数组注入。此数组中所有对象的依赖关系也已解决
在Nest.js中有什么方法可以实现这一点吗?没有直接等同于
多注入的方法。您可以为阵列提供以下选项:
例子
试试这个例子吧
注射剂
假设您有多个@可注射的类实现接口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
都可在您的模块中使用(提供或从其他模块导入)。现在为动物的数组创建一个自定义标记:
providers: [
Cat,
Dog,
{
provide: 'MyAnimals',
useFactory: (cat, dog) => [cat, dog],
inject: [Cat, Dog],
},
],
控制器
然后,您可以在控制器中注入并使用动物
数组,如下所示:
constructor(@Inject('MyAnimals') private animals: Animal[]) {
}
@Get()
async get() {
return this.animals.map(a => a.makeSound()).join(' and ');
}
如果Dog
具有其他依赖项,如Toy
,只要模块中有Toy
可用(导入/提供),则此功能也有效:
只需对@kim kern的伟大解决方案进行一个小调整,您就可以使用该解决方案,但可以避免添加新条目的一点开销
替换
providers: [
Cat,
Dog,
{
provide: 'MyAnimals',
useFactory: (cat, dog) => [cat, dog],
inject: [Cat, Dog],
},
],
与
这只是一个小问题,但不是必须在3位置添加一个新的,而是减少到2。当您有一些错误时,这些错误就会增加,并减少出错的机会
nest团队也在努力简化这一过程,您可以通过github问题进行跟踪:我希望我能多次投票;)
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],
},
],