Blog>
Snippets

NgModule Providers Scoping

Explain and show how the providers in an NgModule are scoped to the module, allowing for singleton services or multiple instances, depending on where the module is imported.
// Define a service
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root' // Singleton instance across the app
})
export class MySingletonService {
  // Service logic here
}
This service is decorated with 'providedIn: root' which means it will be a singleton across the entire application once it is imported anywhere.
// Define a service
import { Injectable } from '@angular/core';

@Injectable()
export class MyModuleScopedService {
  // Service logic here
}
This service does not specify 'providedIn'. To scope it to a module, it will be provided in the module's providers array.
// Define a module that provides the service
import { NgModule } from '@angular/core';
import { MyModuleScopedService } from './my-module-scoped.service';

@NgModule({
  providers: [MyModuleScopedService]
})
export class MyModule {
  // Module logic here
}
MyModuleScopedService is declared in the providers array of MyModule. Any component or service within MyModule will get the same instance of MyModuleScopedService, but a different instance from other modules.
// Define another module that reuses MyModuleScopedService
import { NgModule } from '@angular/core';
import { MyModuleScopedService } from './my-module-scoped.service';

@NgModule({
  providers: [MyModuleScopedService]
})
export class MyOtherModule {
  // Module logic here
}
If MyOtherModule also provides MyModuleScopedService, components and services in MyOtherModule will get a different instance of MyModuleScopedService than those in MyModule.