Мультиинжект в 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

Другие вопросы по тегам