2019-12-02 12:47:19 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# Dependency injection in Angular
  
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-31 12:02:50 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Dependencies are services or objects that a class needs to perform its function.
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Dependency injection, or DI, is a design pattern in which a class requests dependencies from external sources rather than creating them.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Angular's DI framework provides dependencies to a class upon instantiation.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								You can use Angular DI to increase flexibility and modularity in your applications.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-17 14:58:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< div  class = "alert is-helpful" >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								See the < live-example > < / live-example >  for a working example containing the code snippets in this guide.
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-10 16:51:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / div >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Creating an injectable service
  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								To generate a new `HeroService`  class in the `src/app/heroes`  folder use the following [Angular CLI ](cli ) command.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-31 12:02:50 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  language = "sh"  class = "code-shell" >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ng generate service heroes/hero
							 
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								This command creates the following default `HeroService` .
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-11 13:29:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "dependency-injection/src/app/heroes/hero.service.0.ts"  header = "src/app/heroes/hero.service.ts (CLI-generated)" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `@Injectable()`  decorator specifies that Angular can use this class in the DI system.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The metadata, `providedIn: 'root'` , means that the `HeroService`  is visible throughout the application.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Next, to get the hero mock data, add a `getHeroes()`  method that returns the heroes from `mock.heroes.ts` .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-11 13:29:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  path = "dependency-injection/src/app/heroes/hero.service.3.ts"  header = "src/app/heroes/hero.service.ts" >  
						 
					
						
							
								
									
										
										
										
											2017-03-27 16:08:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								For clarity and maintainability, it is recommended that you define components and services in separate files.
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 18:09:39 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								If you do combine a component and service in the same file, it is important to define the service first, and then the component.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								If you define the component before the service, Angular returns a run-time null reference error.
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-01 11:26:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-14 14:17:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{@a  injector-config}
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{@a  bootstrap}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-31 12:02:50 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Injecting services
  
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Injecting services results in making them visible to a component.
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								To inject a dependency in a component's `constructor()` , supply a constructor argument with the dependency type.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The following example specifies the `HeroService`  in the `HeroListComponent`  constructor.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The type of `heroService`  is `HeroService` .
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-11 13:29:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< code-example  header = "src/app/heroes/hero-list.component (constructor signature)"  path = "dependency-injection/src/app/heroes/hero-list.component.ts"  
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								region="ctor-signature">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / code-example >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-23 17:44:11 +03:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								For more information, see [Providing dependencies in modules ](guide/providers ) and [Hierarchical injectors ](guide/hierarchical-dependency-injection ).
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{@a  service-needs-service}
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Using services in other services
  
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								When a service depends on another service, follow the same pattern as injecting into a component.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								In the following example `HeroService`  depends on a `Logger`  service to report its activities.
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								First, import the `Logger`  service.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Next, inject the `Logger`  service in the `HeroService`  `constructor()`  by specifying `private logger: Logger`  within the parentheses.
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								When you create a class whose `constructor()`  has parameters, specify the type and metadata about those parameters so that Angular can inject the correct service.
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Here, the `constructor()`  specifies a type of `Logger`  and stores the instance of `Logger`  in a private field called `logger` .
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The following code tabs feature the `Logger`  service and two versions of `HeroService` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The first version of `HeroService`  does not depend on the `Logger`  service.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The revised second version does depend on `Logger`  service.
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< code-tabs >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-11 13:29:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  header = "src/app/heroes/hero.service (v2)"  path = "dependency-injection/src/app/heroes/hero.service.2.ts" > 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-11 13:29:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  header = "src/app/heroes/hero.service (v1)"  path = "dependency-injection/src/app/heroes/hero.service.1.ts" > 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-11 13:29:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < code-pane  header = "src/app/logger.service" 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-31 12:02:50 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  path="dependency-injection/src/app/logger.service.ts">
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  < / code-pane > 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-31 12:02:50 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< / code-tabs >  
						 
					
						
							
								
									
										
										
										
											2018-03-27 10:27:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								In this example, the `getHeroes()`  method uses the `Logger`  service by logging a message when fetching heroes.
							 
						 
					
						
							
								
									
										
										
										
											2017-04-01 01:57:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## What's next
  
						 
					
						
							
								
									
										
										
										
											2017-10-23 17:44:49 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 08:57:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  [Dependency providers ](guide/dependency-injection-providers ) 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  [DI tokens and providers ](guide/dependency-injection-providers ) 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  [Dependency Injection in Action ](guide/dependency-injection-in-action )