угловая инъекция зависимости

В последнем выпуске угловых 6, служба регистрируется в модуле с помощью providedIn свойства в метаданных службы:

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

Однако документация по-прежнему также относится к регистрации службы в массиве providers модулей в метаданных модуля, как мы это делали в Angular 5:

@NgModule({
  providers: [HeroService],
})
export class AppModule {}

Так,

  • Какой метод должен использоваться для информирования инжектора об услуге, которую он должен внедрить?
  • Будет ли устаревать метод массива providers модулей?

Ответ 1

В принципе вы можете использовать либо, но в соответствии с новым интерфейсом CLI, provideIn будет автоматически добавляться при создании service

providedIn

Теперь существует новый рекомендованный способ регистрации провайдера непосредственно внутри декоратора @Injectable() с использованием нового атрибута @Injectable(). Он принимает 'root' как значение или любой модуль вашего приложения. Когда вы используете 'root', ваша инъекция будет зарегистрирована как односторонняя в приложении, и вам не нужно добавлять ее к поставщикам корневого модуля. Аналогичным образом, если вы используете providedIn: UsersModule, инъекция регистрируется как поставщик UsersModule без добавления его поставщикам модуля.

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

Для получения дополнительной информации см. Здесь

Ответ 2

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

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

Таким образом, в основном вы будете использовать providedIn: 'root' для любых служб, которые широко применяются. Для других служб продолжайте использовать старую версию.

Не забывайте, что у вас уже был выбор для предоставления услуг по-разному. Например, также можно объявить Injectable на уровне компонента (это не изменяется в V6).

  @Component({
    selector: 'app-my-component',
    templateUrl: './my.component.html',
    providers: [ MyService ]
  })

Таким образом, сервис становится доступным только в MyComponent и его дереве подкомпонентов.

Ответ 3

Если вы используете угловой 5+ разработчик, он автоматически создаст инъецируемую службу, когда она будет объявлена как обеспечено: "root", в этом случае вам не потребуется импортировать службу в app.module.ts. Вы можете напрямую использовать его в другом компоненте.

Ответ 4

@NgModule() и @Component() имеют опцию метаданных провайдеров, где вы можете настроить провайдеров для инжекторов уровня NgModule или уровня компонента.

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

В вашем случае, поскольку он был предоставлен на уровне "root", нет необходимости добавлять его снова в качестве поставщика в модуле.

Подробнее о внедрении зависимостей здесь