Angular 6 Services: providedIn: 'root' vs CoreModule

Manish Jain picture Manish Jain · Jun 14, 2018 · Viewed 11.6k times · Source

With Angular 6, below is the preferred way to create singleton services:

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

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

From Angular doc: When you provide the service at the root level, Angular creates a single, shared instance of HeroService and injects into any class that asks for it. Registering the provider in the @Injectable metadata also allows Angular to optimize an app by removing the service if it turns out not to be used after all.

Also,

providers: [
    // no need to place any providers due to the `providedIn` flag...
  ]

So, does that mean we no more need CoreModule? We can import services and other common modules directly into AppModule.

Answer

Otto Cheley picture Otto Cheley · May 6, 2019

Well I would consider it as an alternative to creating a CoreModule, the documentation clearly states:

There are two ways to make a service a singleton in Angular: Declare root for the value of the @Injectable() providedIn property

Include the service in the AppModule or in a module that is only imported by the AppModule

I found this here Singleton Services doc

If you app has a CoreModule of pure services you could simply get rid of it(if you don't think is necessary of course), although I don't recommend it, for me I consider it more mantainable to have a CoreModule because I can easily find it in the project and tells me what services are fundamental for the app and we need only one instance from them, instead of having to open a search dialog in the IDE and look for all the services that have the providedIn: 'root' setted.