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

Провайдеры

script1adsense2code
script1adsense3code

Поставщик - это инструкция для системы DI о том, как получить значение для зависимости. В большинстве случаев эти зависимости являются услугами, которые вы создаете и предоставляете.

Предоставление услуги

Если у вас уже есть приложение, созданное с помощью Angular CLI, вы можете создать службу с помощью команды ng generate CLI в корневом каталоге проекта. Замените Пользователя названием вашей услуги.

ng generate service User

Эта команда создает следующий скелет UserService:

User.service.0.ts

import { Injectable } from '@angular/core';
import { UserModule } from './user.module';
@Injectable({
  providedIn: UserModule,
})
export class UserService {
}

Теперь вы можете внедрить UserService в любом месте вашего приложения.

Сам сервис - это класс, сгенерированный CLI и украшенный @Injectable (). По умолчанию у этого декоратора есть свойство обеспечить в, которое создает провайдера для сервиса. В этом случае обеспеченный In: 'root' указывает, что Angular должен предоставить сервис в корневом инжекторе.

Объем провайдера

Когда вы добавляете поставщика услуг в инжектор корневого приложения, он становится доступным во всем приложении. Кроме того, эти поставщики также доступны для всех классов в приложении, если у них есть токен поиска.

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

предоставляются в и NgModules

Также можно указать, что служба должна предоставляться в определенном модуле @NgModule. Например, если вы не хотите, чтобы UserService был доступен для приложений, если они не импортируют созданный вами UserModule, вы можете указать, что служба должна предоставляться в модуле:

User.service.1.ts

import { Injectable } from '@angular/core';
import { UserModule } from './user.module';
@Injectable({
  providedIn: UserModule,
})
export class UserService {
}

В приведенном выше примере показан предпочтительный способ предоставления услуги в модуле. Этот метод предпочтителен, потому что он позволяет трясти службу в дереве, если ее не внедряет ничего. Если в сервисе невозможно указать, какой модуль должен его предоставлять, вы также можете объявить провайдера для сервиса в модуле:

User.module.ts

import { NgModule } from '@angular/core';
import { UserService } from './user.service';
@NgModule({
  providers: [UserService],
})
export class UserModule {
}

Ограничение диапазона провайдера ленивыми загрузочными модулями

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

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

Когда угловой маршрутизатор лениво загружает модуль, он создает новый инжектор. Этот инжектор является потомком инжектора корневого приложения. Представьте себе дерево инжекторов; Существует один корневой инжектор, а затем дочерний инжектор для каждого лениво загруженного модуля. Маршрутизатор добавляет всех поставщиков от корневого инжектора к дочернему инжектору. Когда маршрутизатор создает компонент в лениво загруженном контексте, Angular предпочитает экземпляры службы, созданные от этих поставщиков, экземплярам службы корневого инжектора приложения.

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

Хотя вы можете предоставлять услуги с помощью отложенной загрузки модулей, не все службы могут быть загружены с отложенной загрузкой.

Ограничение области действия поставщика компонентами

Другой способ ограничить область действия поставщика - добавить службу, которую вы хотите ограничить, в массив поставщиков. Поставщики компонентов и поставщики NgModule не зависят друг от друга. Этот метод полезен для тех случаев, когда вы хотите загружать модуль, которому нужен только сервис. Предоставление сервиса в компоненте ограничивает сервис только этим компонентом (другие компоненты в том же модуле не могут получить к нему доступ).

app.component.ts

@Component({
/* . . . */
  providers: [UserService]
})

Предоставление услуг в модулях против компонентов

Как правило, предоставьте сервисы, необходимые для всего приложения в корневом модуле, и предоставьте сервисы в виде лениво загруженных модулей.

Маршрутизатор работает на корневом уровне, поэтому, если вы поместите провайдеров в компонент, даже AppComponent, лениво загруженные модули, которые зависят от маршрутизатора, не сможет их увидеть.

Предыдущий: Угловая служба Singleton
Next: Модуль отложенной загрузки

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


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code