Зачем использовать свойство `deps` в DI

Вот фрагмент кода из angular.io:

{ provide: RUNNERS_UP,    useFactory:  runnersUpFactory(2), deps: [Hero, HeroService] }

...

export function runnersUpFactory(take: number) {
  return (winner: Hero, heroService: HeroService): string => {
    /* ... */
  };
};

Мой вопрос: почему здесь используется свойство deps? Каковы общие случаи использования deps?


person Max Koretskyi    schedule 24.01.2017    source источник
comment
См. руководство angular.io/docs/ts/latest. /api/core/index/ , он довольно исчерпывающий.   -  person Estus Flask    schedule 24.01.2017
comment
@estus, спасибо, я видел руководство. Я обычно задаю вопрос, чтобы получить более широкую картину, а в руководстве просто написано, что он используется с заводскими поставщиками. Но ограничивается ли этим? Есть ли другие варианты использования? и т.д. вот такие вопросы у меня в голове   -  person Max Koretskyi    schedule 24.01.2017
comment
Да, это ограничено заводами. Преимущество TS в том, что свойства не появляются из ниоткуда, они определяются с помощью интерфейсов (здесь FactoryProvider).   -  person Estus Flask    schedule 24.01.2017
comment
@estus, понял, спасибо   -  person Max Koretskyi    schedule 24.01.2017


Ответы (1)


Это способ сообщить инъекциям зависимостей Angular, какие зависимости необходимо внедрить в фабричную функцию, возвращаемую runnersUpFactory.

Для сервисов есть класс @Injectable(), чтобы сообщить DI, что ему нужно проанализировать параметр конструктора этого класса (то же самое для @Component(), @Directive() и @Pipe()), но, похоже, это не работает для функций. Поэтому они ввели параметр deps.

DI будет искать поставщика с помощью ключа Hero и другого с помощью HeroService, а затем передавать их в качестве параметров фабричной функции в том же порядке.

https://angular.io/docs/ts/latest/api/core/index/FactoryProvider-interface.html

deps : any[] Список токенов, которые необходимо разрешить инжектору. Затем список значений используется в качестве аргументов функции useFactory.

person Günter Zöchbauer    schedule 24.01.2017
comment
спасибо, так что это в основном актуально только тогда, когда используется useFactory, верно? когда используются другие провайдеры, такие как useClass, useValue и useExisting, это не имеет смысла? - person Max Koretskyi; 24.01.2017
comment
Точно - только для useFactory - person Günter Zöchbauer; 24.01.2017
comment
Большое спасибо. Просто быстрое продолжение, есть ли какой-либо другой провайдер, кроме тех, которые я упомянул в своем предыдущем комментарии? - person Max Koretskyi; 24.01.2017
comment
Вот такая непоследовательность мне не нравится в Angular 2. - person Karl; 24.01.2017
comment
github.com/angular /угловой/блоб/ - person Günter Zöchbauer; 24.01.2017
comment
@Karl Функция не может быть аннотирована для DI с помощью декораторов, это ограничение TS. Если вам нужна согласованность, вы всегда можете аннотировать его как factoryFn.parameters = [[new Inject(dep)]] вместо deps: [dep], это общий синтаксис для всех DI. - person Estus Flask; 24.01.2017
comment
@Эстус, Гюнтер! Спасибо обоим за очень полезную информацию ;-) - person Karl; 24.01.2017
comment
@GünterZöchbauer Вы уверены, что они предназначены только для useFactory? Я вчера спрашивал, мне сказали - нет. - person Royi Namir; 03.02.2018
comment
@RoyiNamir кажется разумным. Может быть удобно в редких (я думаю) ситуациях. Не видел его раньше. - person Günter Zöchbauer; 03.02.2018
comment
Это не очень хорошо документировано, но deps можно использовать с useClass: «можно ли также использовать deps с useclass»> stackoverflow.com/questions/48594944/ - person pixelbits; 03.02.2018
comment
@pixelbits спасибо за информацию. Ройи уже связался с вашим ответом. Это имеет смысл, мне просто не приходило в голову, что это может быть полезно, но я могу представить сценарии. - person Günter Zöchbauer; 03.02.2018