Угловые 6 Услуги: предоставляютсяIn: "корень" против CoreModule
С помощью Angular 6 ниже предпочтительный способ создания сервисов Singleton:
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class UserService {
}
From Angular doc: Когда вы предоставляете услугу на корневом уровне, Angular создает единый общий экземпляр HeroService и вводит в любой класс, который его запрашивает. Регистрация провайдера в метаданных @Injectable также позволяет Angular оптимизировать приложение, удалив службу, если она не будет использоваться в конце концов.
Также,
providers: [
// no need to place any providers due to the 'providedIn' flag...
]
Итак, значит ли это, что нам больше не нужен CoreModule? Мы можем импортировать сервисы и другие распространенные модули непосредственно в AppModule.
Ответы
Ответ 1
Это было бы верно, если CoreModule содержал только сервисы. Однако он включает в себя другие вещи, такие как компоненты с одним использованием.
Из угловых документов:
Соберите одноразовые компоненты единого приложения в CoreModule. Импортируйте его один раз (в AppModule), когда приложение запустится и никогда не импортирует его нигде. (например, NavComponent и SpinnerComponent).
Ответ 2
А как насчет перехватчиков и охранников? Думаю, это может быть глобальным. Я согласен с вашим соображением о том, что CoreModule не имеет деклараций и только чистых сервисов, но я думаю, что и гвардейцы, и перехватчики тоже должны быть внимательны.
Ответ 3
Я бы по- прежнему держать CoreModule для отдельных компонентов и использования Http перехватчики, с providedIn
собственности в настоящее время рекомендуемый способ зарегистрировать одноэлементные услуг, только для ясности я бы поставил все свои одноэлементные услуги в директории ядро/услуг
Ответ 4
Что ж, я бы рассмотрел это как альтернативу созданию CoreModule, в документации четко сказано:
Есть два способа сделать сервис одноэлементным в Angular: объявить root для значения свойства @Injectable() provideIn
Включите сервис в AppModule или в модуль, который импортируется только AppModule
Я нашел здесь Singleton Services документ
Если у вашего приложения есть CoreModule из чистых сервисов, вы можете просто избавиться от него (если, конечно, вы не считаете это необходимым), хотя я не рекомендую его, для себя я считаю более приемлемым иметь CoreModule, потому что я может легко найти его в проекте и сказать мне, какие сервисы являются фундаментальными для приложения, и нам нужен только один экземпляр из них, вместо того, чтобы открывать диалоговое окно поиска в IDE и искать все сервисы, у которых есть providedIn: 'root'
установлено.