useValue против useFactory
В чем разница между useValue
а также useFactory
провайдеры?
Похоже на то useFactory
возвращает значение и useClass
также делает то же самое.
2 ответа
useFactory
принимает фабричную функцию, которая должна возвращать значение, а также может иметь зависимости (требовать, чтобы экземпляры других провайдеров передавались в качестве параметра)
Смотрите, например, config:ConfigService
параметр, необходимый для заводской функции в разделе Как передать параметры, отрисованные из бэкэнда, в метод начальной загрузки angular2
useValue
это просто значение, которое вводится как естьuseClass
ожидает имя типа, и Angular создает экземпляр из переданного типа, а также разрешает и передает параметры конструктора в класс, если таковые имеютсяСуществует также
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