В Inversify.js есть декоратор multiInject
который позволяет нам вводить несколько объектов в виде массива. Все зависимые объекты в этом массиве также решены.
Есть ли способ достичь этого в Nest.js?
Нет прямого эквивалента multiInject
. Однако вы можете предоставить массив с помощью настраиваемого поставщика:
Предположим, у вас есть несколько классов @Injectable
которые реализуют интерфейс 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!';
}
}