Я предоставляю некоторые значения констант через ValueProvider
, и я немного удивлен семантией c различий между ClassProvider
& ValueProvider
.
Мой текущий ValueProvider выглядит следующим образом:
Определение провайдера:
export const DeliveryChangeTextToken = new InjectionToken<DeliveryTextsAndConditionsIfc[]>('Provides text option values for delivery component');
export const DELIVERY_CHANGE_TEXT_PROVIDER: ValueProvider = {
provide: DeliveryChangeTextToken,
useValue: /* Here is object literal or imported value, whatever */
}
Теперь внутри модуля я добавляю нового провайдера в массив провайдеров:
providers: [DELIVERY_CHANGE_TEXT_PROVIDER]
И я использую его как компонент итак:
constructor(@Inject(DeliveryChangeTextToken) texts: DeliveryTextsAndConditionsIfc[])
{ this.specialTxtConditions = texts; }
Работает и нормально, но я немного обеспокоен этими Provider
массивом и конструктором @Inject
фигур.
В объявлении модуля используется форма Provider[]
, который является литералом поставщика, состоящим из provide
, useValue
и multi
полей sob, все они заключены в DELIVERY_CHANGE_TEXT_PROVIDER
. Просто и элегантно.
Но для доступа к нему внутри компонента ему нужно предоставить @Inject()
, который принимает тип токена, в моем случае это DeliveryChangeTextToken
.
Это немного сбивает с толку и требует перехода между 3 файлами, чтобы увидеть, какое значение под каким токеном фактически предоставляется и отличается от того, как ClassProvider
, самый распространенный провайдер каждый раз используется под одним и тем же именем в коде:
Сервис:
@Injectable()
export class Service{}
Модуль:
provide: [Service]
Компонент:
constructor(private service: Service)
Есть ли способ обеспечить согласованность между декларацией поставщика и фактической семантикой ввода DI?
И, возможно, дополнительный вопрос, что за волшебные c @Injectable()
на самом деле делают, чтобы сделать так, чтобы ClassProvider
s работал?
EDIT: Развертывание литерала объекта провайдера, конечно, вариант, чтобы обеспечить sam-форму в обоих местах, но я бы предпочел использовать более короткую форму Provider в обоих местах, чем более длинную раздутую форму литерала поставщика:
providers: [
{
provide: DeliveryChangeTextToken, useValue: /* Here is object literal or imported value, whatever */
}
]