useValue против useFactory

В чем разница между useValue а также useFactory провайдеры?

Похоже на то useFactory возвращает значение и useClass также делает то же самое.

2 ответа

  • useFactory принимает фабричную функцию, которая должна возвращать значение, а также может иметь зависимости (требовать, чтобы экземпляры других провайдеров передавались в качестве параметра)

Смотрите, например, config:ConfigService параметр, необходимый для заводской функции в разделе Как передать параметры, отрисованные из бэкэнда, в метод начальной загрузки angular2

  • useValue это просто значение, которое вводится как есть

  • useClass ожидает имя типа, и Angular создает экземпляр из переданного типа, а также разрешает и передает параметры конструктора в класс, если таковые имеются

  • Существует также useExisting который похож на псевдоним для уже зарегистрированного провайдера. Вариант использования - предоставить одному и тому же экземпляру провайдера разные ключи.

См. Пример использования Angular 2 useExisting.

useValue: назначит текущий любой назначенный экземпляр объекта, который вы предоставили.

useFactory : Это также делает то же самое, вы можете настроить фабричный объект на основе других зависимостей внутри function и, прежде чем вернуть экземпляр этого.

{ 
  provide: CustomDependency,
  useFactory: () => {
    if (IS_A) {
      return new A();
    } else {
      return new B();
    }
  }
}

Ты можешь использовать useFactory настроить вашу зависимость во время настройки. Это так же, как config фаза Angular 1, где вы изменяете или формируете зависимость по мере необходимости.

Мое основное понимание...

Вы можете думать useValueпримерно как статическое присваивание; Провайдер придерживается интерфейса ValueProvider:

Учитывая, что вам всегда нужна ценность '12345' когда используешь @Inject(INJECTION_TOKEN), тогда это сработает,

providers: [
  {
    provide: INJECTION_TOKEN,
    useValue: '12345',
  },
],

Это всегда будет возвращать "1234" при использовании @Inject(INJECTION_TOKEN).

В то время как,

providers: [
  {
    provide: INJECTION_TOKEN,
    useValue: () => '12345',
  },
],

Обеспечит функцию для INJECTION_TOKEN это вернет "12345".

useFactoryожидает, что функция произведет введенное значение. Возвращаемое значение фабричной функции - это то, что вводится. Этот, useFactoryТип провайдера использует интерфейс FactoryProvider. Необязательный массив deps можно добавить, что позволяет передавать аргументы в фабричную функцию.

В заключение, useClass,

Настраивает инжектор для возврата экземпляра useClass для токена. [1]

Инжектор предоставит экземпляр предоставленного класса. Примечательно, что инжектор также предоставит введенные зависимости Type<any>, тип значения поля, useClass на ClassProvider [1] интерфейс.

Подводя итог, выберите useValue чтобы каждый раз обеспечивать одно и то же вводимое значение *, useFactory когда значение впрыска должно быть вычислено во время выполнения, и useClass когда вы хотите, чтобы инжектор построил значение Type<any> предоставлять.

* Примечание: значение предоставлено useValue может быть функцией, поэтому может генерировать динамические значения, если введенное значение вызывается, потому что это функция.

[1] ClassProvider

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