📖 Scenario: You are building a simple Angular application that shows a welcome message. You want to use Angular's dependency injection system to provide a service that supplies the message text.
🎯 Goal: Create an Angular standalone component that uses dependency injection to get a message from a service and display it.
📋 What You'll Learn
Create a service class called MessageService that has a method getMessage() returning the string 'Hello from Angular DI!'.
Create a standalone component called WelcomeComponent.
Inject the MessageService into the WelcomeComponent using Angular's dependency injection.
Display the message from the service inside the component's template.
💡 Why This Matters
🌍 Real World
Dependency injection is a core feature in Angular that helps manage how components get the services they need. This makes your app easier to maintain and test.
💼 Career
Understanding Angular's dependency injection is essential for building scalable and testable Angular applications, a key skill for frontend developers working with Angular.
Progress0 / 4 steps
1
Create the MessageService
Create a service class called MessageService with a method getMessage() that returns the string 'Hello from Angular DI!'.
Angular
Hint
Define a class with a method that returns the exact string.
2
Create the WelcomeComponent
Create a standalone Angular component called WelcomeComponent with a template that will display a message. Use the @Component decorator with standalone: true and a template containing <h1>{{ message }}</h1>.
Angular
Hint
Use the @Component decorator with standalone: true and a simple template.
3
Inject MessageService into WelcomeComponent
Inject the MessageService into the WelcomeComponent constructor using Angular's dependency injection. Assign the message from messageService.getMessage() to the component's message property.
Angular
Hint
Use constructor injection and assign the message inside the constructor.
4
Provide MessageService in WelcomeComponent
Add the providers array to the @Component decorator of WelcomeComponent and include MessageService to make it available for injection.
Angular
Hint
Add providers: [MessageService] inside the @Component decorator.
Practice
(1/5)
1. What is the main purpose of dependency injection in Angular?
easy
A. To write all code inside a single file
B. To manually create instances of services inside components
C. To provide components with the services they need automatically
D. To prevent components from using any services
Solution
Step 1: Understand dependency injection concept
Dependency injection automatically provides required services to components without manual creation.
Step 2: Compare options with this concept
Only To provide components with the services they need automatically describes automatic provision of services, which is the core of dependency injection.
Final Answer:
To provide components with the services they need automatically -> Option C
Quick Check:
Dependency injection = automatic service provision [OK]
Hint: Dependency injection means Angular gives services automatically [OK]
Common Mistakes:
Thinking you must create service instances manually
Believing dependency injection restricts service use
Confusing dependency injection with code organization
2. Which decorator makes a class injectable in Angular?
easy
A. @Component
B. @Input
C. @NgModule
D. @Injectable
Solution
Step 1: Identify Angular decorators for injection
The decorator @Injectable marks a class as available for dependency injection.
Step 2: Eliminate other decorators
@Component is for components, @NgModule for modules, and @Input for input properties, none make a class injectable.
Final Answer:
@Injectable -> Option D
Quick Check:
@Injectable = makes class injectable [OK]
Hint: Use @Injectable to mark services for injection [OK]
Common Mistakes:
Confusing @Component with @Injectable
Using @NgModule to make services injectable
Forgetting to add @Injectable to services
3. Given this Angular service and component code, what will be logged?
import { Injectable } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class LoggerService {
log(message: string) {
console.log('Log:', message);
}
}
import { Component } from '@angular/core';
import { LoggerService } from './logger.service';
@Component({ selector: 'app-root', template: '' })
export class AppComponent {
constructor(private logger: LoggerService) {
this.logger.log('Hello');
}
}
medium
A. Log: Hello
B. Error: LoggerService not found
C. No output
D. Log: undefined
Solution
Step 1: Understand service injection in constructor
The LoggerService is injected into AppComponent via constructor and used to log a message.
Step 2: Analyze the log call
The log method prints 'Log:' plus the message 'Hello', so console shows 'Log: Hello'.
Final Answer:
Log: Hello -> Option A
Quick Check:
Injected service logs message correctly [OK]
Hint: Injected services work via constructor parameters [OK]
Common Mistakes:
Expecting error if service is providedIn root
Thinking log method won't run without template
Confusing console output with return value
4. What is wrong with this Angular service injection code?
import { Injectable } from '@angular/core';
@Injectable()
export class DataService {
getData() { return [1, 2, 3]; }
}
import { Component } from '@angular/core';
@Component({ selector: 'app-data', template: '' })
export class DataComponent {
constructor(private dataService: DataService) {}
}
medium
A. DataComponent constructor should not have parameters
B. DataService is not provided in any injector
C. DataService class is missing @Component decorator
D. getData method must be static
Solution
Step 1: Check service provider configuration
The service has @Injectable() but no providedIn or provider registration, so Angular doesn't know where to provide it.
Step 2: Understand injection failure cause
Without being provided, Angular throws an error when injecting DataService into DataComponent.
Final Answer:
DataService is not provided in any injector -> Option B
Quick Check:
Missing provider causes injection error [OK]
Hint: Always provide services via providedIn or providers array [OK]
Common Mistakes:
Assuming @Injectable alone provides the service
Adding @Component to services incorrectly
Thinking constructor parameters are optional for injection
5. You want to inject two different services of the same class but with different configurations in Angular. Which approach correctly achieves this?
hard
A. Use Angular injection tokens to provide different configurations and inject by token
B. Create two different classes extending the service and inject each separately
C. Use @Injectable({ providedIn: 'root' }) on the class and inject twice in constructor
D. Inject the service once and manually change its configuration before each use
Solution
Step 1: Understand multiple instances need
Injecting the same class twice with different configs requires distinguishing them in Angular's injector.
Step 2: Use injection tokens for different configs
Angular injection tokens allow providing multiple versions of the same class with different configurations and injecting them separately.
Step 3: Evaluate other options
Use @Injectable({ providedIn: 'root' }) on the class and inject twice in constructor injects the same instance twice, B duplicates classes unnecessarily, D is error-prone and not recommended.
Final Answer:
Use Angular injection tokens to provide different configurations and inject by token -> Option A