кодесурса
«Угловое

Поставщики зависимостей

script1adsense2code
script1adsense3code

Поставщик зависимостей настраивает инжектор с токеном DI, который этот инжектор использует для предоставления конкретной версии значения зависимости во время выполнения. Инжектор использует конфигурацию провайдера для создания экземпляров зависимостей, которые он внедряет в компоненты, директивы, каналы и другие сервисы.

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

В следующем типичном примере сам класс Logger предоставляет экземпляр Logger.

providers: [Logger]

Однако вы можете настроить инжектор с альтернативным провайдером, чтобы доставить какой-то другой объект, который обеспечивает необходимые функции ведения журнала. Например:

  • Вы можете предоставить замещающий класс.
  • Вы можете предоставить похожий на логгер объект.
  • Ваш провайдер может вызвать функцию фабрики регистратора.

Провайдерный объектный литерал

Синтаксис поставщика классов - это сокращенное выражение, которое расширяется до конфигурации поставщика, определенной интерфейсом поставщика.

Приведенный ниже фрагмент кода показывает, как класс, заданный в качестве значения провайдера, расширяется до полного объекта провайдера.

providers: [Logger]
[{ provide: Logger, useClass: Logger }]

Расширенная конфигурация провайдера - это литерал объекта с двумя свойствами.

  • Свойство обеспечить содержит маркер, который служит ключом как для определения значения зависимости, так и для настройки инжектора.
  • Второе свойство - это объект определения провайдера, который сообщает инжектору, как создать значение зависимости. Ключом определения провайдера может быть useClass, как в примере выше. Это также может быть useExisting, useValue или useFactory. Каждый из этих ключей обеспечивает свой тип зависимости, как описано ниже.

Поставщики альтернативных классов

Разные классы могут предоставлять одну и ту же услугу. Например, следующий код говорит инжектору возвращать экземпляр BetterLogger, когда компонент запрашивает регистратор с использованием токена Logger.

[{ provide: Logger, useClass: BetterLogger }]

Провайдеры псевдонимов

Предположим, старый компонент зависит от класса OldLogger. OldLogger имеет тот же интерфейс, что и NewLogger, но по какой-то причине вы не можете обновить старый компонент, чтобы использовать его.

Когда старый компонент регистрирует сообщение с помощью OldLogger, вы хотите, чтобы одноэлементный экземпляр NewLogger обрабатывал его. В этом случае инжектор зависимостей должен внедрить этот единственный экземпляр, когда компонент запрашивает новый или старый регистратор. OldLogger должен быть псевдонимом для NewLogger.

[ NewLogger,
  // Not aliased! Creates two instances of `NewLogger`
  { provide: OldLogger, useClass: NewLogger}]

Чтобы убедиться, что существует только один экземпляр NewLogger, псевдоним OldLogger с опцией useExisting.

[ NewLogger,
  // Alias OldLogger w/ reference to NewLogger
  { provide: OldLogger, useExisting: NewLogger}]

Поставщики стоимости

Иногда проще предоставить готовый объект, чем попросить инжектора создать его из класса. Чтобы добавить объект, который вы уже создали, настройте инжектор с параметром useValue следующим образом:

```[{ provide: Logger, useValue: silentLogger }]```

Неклассовые зависимости

Не все зависимости являются классами. Иногда вы хотите ввести строку, функцию или объект.

Приложения часто определяют объекты конфигурации с множеством мелких фактов, таких как название приложения или адрес конечной точки веб-API. Эти объекты конфигурации не всегда являются экземплярами класса. Они могут быть объектными литералами, как показано в следующем примере.

export const HERO_DI_CONFIG: AppConfig = {
  apiEndpoint: 'api.heroes.com',
  title: 'Dependency Injection'
};

Фабрика провайдеров

Иногда вам нужно динамически создать зависимое значение, основываясь на информации, которой у вас не будет до времени выполнения. Например, вам может потребоваться информация, которая неоднократно изменяется в ходе сеанса браузера. Кроме того, ваша инъекционная служба может не иметь независимого доступа к источнику информации.

В таких случаях вы можете использовать заводского поставщика. Поставщики фабрики также могут быть полезны при создании экземпляра зависимости из сторонней библиотеки, которая не предназначена для работы с DI.

Предыдущий: Внедрение зависимостей в угловых
Далее: Иерархические инжекторы зависимости

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code