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