Семантика @Injectable(providedIn: 'root')?

Просто хочу убедиться, что понимаю семантику @Injectable(providedIn: 'root'). До Angular 6, если мы импортируем модуль из NPM, который содержит службу, мы объявляли этот модуль в нашем модуле приложения, чтобы все приложение имело доступ к службе. Что-то вроде этого:

    import { SomeNPModule } from '@ngx/SomeNPModule';

    @NgModule({
    imports: [
        BrowserModule,
        SomeNPModule
    ]
    })
    export class AppModule {}

Теперь мы можем внедрить SomeService, который предоставляет модуль, потому что мы импортировали модуль. С Angular 6 необходимость импортировать SomeNPModule в AppModule устранена, потому что мы используем @Injectable(providedIn: 'root) в самой службе, и когда аннотация запускается, она автоматически делает службу доступной в контейнере для инъекций root?

Обновлять

Итак, у нас есть ответ, но я думаю, что он частично завершен в том смысле, что если мы хотим настроить службу, это обычно делается с помощью метода forRoot в модуле службы... как это делается с помощью Router. Итак, если предположить, что мы не хотим настраивать службу, все, что нам нужно сделать, это внедрить ее, но если мы хотим настроить службу, нам нужно следовать шаблону Router. Поправьте меня, если я допустил ошибки в комментариях, пожалуйста.




Ответы (1)


Когда вы пишете @Injectable(providedIn: 'root'), это означает, что служба используется для всего приложения, и вы можете внедрить ее в любое место приложения.

Если вы хотите сделать сервис singleton только для конкретного модуля, вам нужно назначить свой модуль в качестве параметра для providedIn - @Injectable(providedIn: MyModule)

Единственное другое действие, необходимое для использования @Injectable оформленного сервиса, — это импортировать его, а конструктор внедрить его, и все. Нет необходимости импортировать его в файл AppModule.

person Suren Srapyan    schedule 23.08.2018
comment
Да, используя свойство Angular 6 provideIn, его больше не нужно добавлять в провайдеры - person Suren Srapyan; 23.08.2018
comment
@SurenSrapyan Это верно для любой ситуации, когда вы хотите, чтобы служба была единственной для всего приложения. Однако, если вам нужен уникальный экземпляр службы в разных модулях или компонентах, вам все равно нужно использовать массив провайдеров. - person Dale Harris; 04.10.2019
comment
Вы можете просто указать имя модуля в параметре createdIn, и оно будет добавлено только к этому модулю. - person Suren Srapyan; 04.10.2019