In this post, I am going to discuss what is the difference between @Inject and @Injectable in angular. These decorators are used for injecting the Dependency into component/service. Angular has its own DI framework, which is typically used in the design of Angular applications to increase their efficiency and modularity.
What is Dependency Injection (DI)
Dependency Injection as the name implies is the process of injecting
dependent functionality into modules at run time. Using dependency
injection helps in having a more re-usable code.
For this tutorial, I have created two simple services LogService and AuthService as shown below
LogService.ts
export class LogService {
constructor() {}
log(msg) {
console.log(msg);
}
}
AuthService.ts
import { Injectable } from "@angular/core";
export class AuthService {
constructor() {}
isAuthenicated() {
return true;
}
}
Let’s first registered these services with Angular provider
@NgModule({
imports: [BrowserModule, FormsModule],
declarations: [AppComponent],
bootstrap: [AppComponent],
providers: [AuthService, LogService]
})
export class AppModule {}
What is angular provider?
A provider is an object declared to Angular so that it can be injected in the constructor of your components, directives and other classes instantiated by Angular.
@Inject
It’s a manual way of
Injectingthe dependency into angular.
Let’s suppose you want to use LogService in AuthService
First import the Inject module from @angular/core
import {Inject } from "@angular/core";
and then inject the LogService into AuthService.ts as below
import { Injectable, Inject } from "@angular/core";
import { LogService } from "./log.service";
export class AuthService {
constructor( private logService:LogService) {}
isAuthenicated() {
this.logService.log("Calling isAuthenicated method");
return true;
}
}
If you run the Application you will get following error
Error: Can’t resolve all parameters for AuthService:
Note: Both services are not decorated with @Injectable decorator
Now let’s use the @Inject decorator to use LogService in the AuthService
import { Injectable, Inject } from "@angular/core";
import { LogService } from "./log.service";
export class AuthService {
constructor(@Inject(LogService) private logService ) {}
isAuthenicated() {
this.logService.log("Calling isAuthenicated method");
return true;
}
}
if you run the application you will see the following message in the console
Calling authenticated method
@Injectable
@Injectable decorator is used to automatically inject the dependecy into the angular application
Removed the @Inject constructor decorator from the AuthService and add @Injectable decorator as show below
import { Injectable, Inject } from "@angular/core";
import { LogService } from "./log.service";
@Injectable()
export class AuthService {
constructor( private logService:LogService) {}
isAuthenicated() {
this.logService.log("Calling isAuthenicated method");
return true;
}
}
If you run the application you will not see any error.
DEMO