angular 6 dependency injection

Hamed Baatour picture Hamed Baatour · May 7, 2018 · Viewed 27.8k times · Source

In the latest release of Angular 6, a service is registered in a module using the providedIn property in the service metadata:

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

However the documentation still also refers to registering the service in the module providers array in the module metadata just like we did in Angular 5:

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

So,

  • Which method should be used to make the injector aware of the service that it should inject?
  • Will the module providers array method be deprecated?

Answer

Pardeep Jain picture Pardeep Jain · May 7, 2018

Basically you can use either, But as per new CLI provideIn will be automatically added while creating service

#providedIn

There is now a new, recommended, way to register a provider, directly inside the @Injectable() decorator, using the new providedIn attribute. It accepts 'root' as a value or any module of your application. When you use 'root', your injectable will be registered as a singleton in the application, and you don’t need to add it to the providers of the root module. Similarly, if you use providedIn: UsersModule, the injectable is registered as a provider of the UsersModule without adding it to the providers of the module.

This new way has been introduced to have a better tree-shaking in the application. Currently a service added to the providers of a module will end up in the final bundle, even if it is not used in the application, which is a bit sad.

For more information please refer here