мультиинжект в Nest.js - PullRequest
       33

мультиинжект в Nest.js

0 голосов
/ 19 октября 2018

В Inversify.js есть multiInject декоратор, который позволяет нам вводить несколько объектов в виде массива.Также разрешены все зависимости объектов в этом массиве.

Есть ли способ добиться этого в Nest.js?

1 Ответ

0 голосов
/ 19 октября 2018

Прямого эквивалента multiInject нет.Вы можете предоставить массив с пользовательским провайдером , хотя:

Пример

Попробуйте пример жить в этой песочнице .

Injectables

Предположим, у вас есть несколько @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],
    },
  ],

Controller

Затем вы можете внедрить и использовать массив 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!';
  }
}
...