Angular – Step 9: Dependency Injection


Dependency Injection (DI) is a design pattern that is used in Angular to manage dependencies between objects. It is a way of passing objects and values between components and services without having to create and manage them directly. In Angular, DI is implemented through the use of injectors, providers, and tokens.

This diagram shows that “Dependency Injection” is a sub-topic within “Angular”. Under “Dependency Injection”, there are several concepts such as “Providers”, “Injectors”, “Tokens”, “Hierarchical Injectors”, and “Injector Tree”.

Under “Providers”, there are different ways to provide dependencies such as “useClass”, “useValue”, “useExisting”, and “useFactory”.

Under “Injectors”, there are different types of injectors such as “Root Injector”, “Component Injector”, “NgModule Injector”, and “Element Injector”.

Under “Tokens”, there are different types of tokens such as “Type Tokens”, “Opaque Tokens”, “Injection Tokens”, and “Multi Tokens”.

Finally, “Hierarchical Injectors” is a concept that refers to how injectors are organized in a tree-like structure, where a child injector can inherit dependencies from a parent injector.

Tabular Comparison

Here’s a comparison table that shows the differences between using DI and not using DI in Angular:

Without DIWith DI
Code ComplexityHighLow
Object CreationManualAutomated

As you can see from the table, using DI in Angular can significantly reduce code complexity, improve reusability, and make testing and maintenance easier.

Text Diagram

Here’s a text diagram that shows how DI can be used in Angular:

| Component A |
| Component B |
|  Service   |
| Data Store |

In this diagram, we have two components, A and B, that both depend on a Service and its associated Data Store. Rather than creating the Service and Data Store instances directly in each component, we use DI to inject them into the components automatically.

Complete Code Program

Here’s a complete code program that shows how DI can be used in Angular:

import { Component } from '@angular/core';
import { DataService } from './data.service';

  selector: 'app-data',
  template: `
      <li *ngFor="let item of data">{{ item }}</li>
  providers: [DataService]
export class DataComponent {

  data: any[];

  constructor(private dataService: DataService) { }

  ngOnInit() {
    this.dataService.getData().subscribe(data => { = data;


In this code program, we define a component called DataComponent that depends on a DataService instance. We use DI to inject the DataService into the component’s constructor automatically. This means that we don’t have to create the DataService instance manually in the component, and we can easily test the component by providing a mock DataService instance.


In conclusion, Dependency Injection is a powerful design pattern that can significantly improve the structure, maintainability, and testability of your Angular applications. By using DI to manage dependencies between objects, you can reduce code complexity, improve reusability, and make testing and maintenance easier.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.