Угловые 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' установлено.