Какова цель Предоставлено Индексируемым декоратором при создании Сервисов в Угловом 6?

При генерации сервисов в Angular CLI он добавляет дополнительные метаданные со свойством "предоставлено в" со значением по умолчанию "root" для Injectable декоратора.

@Injectable({
  providedIn: 'root',
})

Что именно предусмотрено в? Я предполагаю, что это делает сервис доступным, как одноэлементный сервис "глобального" типа для всего приложения, однако, не будет ли проще объявить такие сервисы в массиве провайдеров AppModule?

ОБНОВИТЬ:

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

Существует теперь новый, рекомендуется способ регистрации поставщика, непосредственно внутри @Injectable() декоратора, используя новый providedIn атрибут. Он принимает 'root' в качестве значения или любой модуль вашего приложения. Когда вы используете 'root', ваш injectable будет зарегистрирован как одноэлементный в приложении, и вам не нужно добавлять его к поставщикам корневого модуля. Точно так же, если вы используете providedIn: UsersModule, injectable регистрируется как поставщик UsersModule без добавления его к providers модуля. "- https://blog.ninja-squad.com/2018/05/04/what -is-новый-угловой-6/

ОБНОВЛЕНИЕ 2:

После дальнейшего изучения я решил, что полезно providedIn: 'root'

Если вы хотите provide услугу в любом модуле, отличном от корневого, то лучше использовать массив providers в декораторах функциональных модулей, в противном случае вы будете страдать от циклических зависимостей. Интересные обсуждения, которые будут проведены здесь - https://github.com/angular/angular-cli/issues/10170

Ответы

Ответ 1

если вы используете providedIn, инъекция регистрируется как поставщик модуля, не добавляя его поставщикам модуля.

Из Docs

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

Ответ 2

providedIn: 'root' - самый простой и эффективный способ предоставления услуг, начиная с Angular 6:

  1. Служба будет доступна для всего приложения в виде отдельного файла, без необходимости добавлять его в массив поставщиков модулей (например, Angular <= 5).
  2. Если служба используется только в загруженном модуле, она будет загружена этим модулем.
  3. Если он никогда не используется, он не будет содержаться в сборке (дерево потрясено).

Для получения дополнительной информации подумайте о прочтении документации и часто задаваемых вопросов по NgModule.

Btw:

  1. Если вы не хотите использовать одноэлементное приложение для всего приложения, используйте вместо него массив поставщика.
  2. Если вы хотите ограничить область действия, чтобы никакой другой разработчик никогда не использовал вашу службу за пределами определенного модуля, вместо этого используйте массив провайдеров NgModule.

Ответ 3

providedIn сообщает Angular, что корневой инжектор отвечает за создание экземпляра вашей службы. Услуги, предоставляемые таким образом, автоматически становятся доступными для всего приложения и не нуждаются в перечислении в каком-либо модуле.

Сервисные классы могут выступать в роли их собственных поставщиков, поэтому их определение в @Injectable decorator - это все, что вам нужно.

Ответ 4

Согласно Documentation:

Регистрация провайдера в метаданных @Injectable() также позволяет Angular оптимизировать приложение, удалив службу из скомпилированного приложения, если оно не используется.

Ответ 5

Из документов

Что такое инъекционный декоратор?

Помечает класс как доступный для Injector для создания.

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class UserService {
}

Сам сервис - это класс, сгенерированный CLI и декорированный с помощью @Injectable().

Что именно предусмотрено в?

Определяет, какие инжекторы будут предоставлять инъекцию, либо связывая ее с @NgModule или другим InjectorType, либо указав, что эта инъекция должна быть предоставлена в инжекторе "root", который будет инжектором уровня приложения в большинстве приложений.

providedIn: Type<any> | 'root' | null

условии в: "корень"

Когда вы предоставляете сервис на корневом уровне, Angular создает один общий экземпляр сервиса и внедряет его в любой класс, который его запрашивает. Регистрация провайдера в метаданных @Injectable() также позволяет Angular оптимизировать приложение, удаляя службу из скомпилированного приложения, если оно не используется.

В наличии: Модуль

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

import { Injectable } from '@angular/core';
import { UserModule } from './user.module';

@Injectable({
  providedIn: UserModule,
})
export class UserService {
}

Этот метод предпочтителен, потому что он позволяет трясти службу в дереве, если ее не внедряет ничего.

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

import { NgModule } from '@angular/core';
import { UserService } from './user.service';

@NgModule({
  providers: [UserService],
})
export class UserModule {
}