skills/dev-skills/angular-developer/references/creating-services.md
Services in Angular are reusable pieces of code that handle data fetching, business logic, or state management that multiple components or other services need to access.
You can generate a service using the Angular CLI:
ng generate service my-data
Or you can manually create a TypeScript class and decorate it with @Service().
import {Service} from '@angular/core';
@Service()
export class BasicDataStore {
private data: string[] = [];
addData(item: string): void {
this.data.push(item);
}
getData(): string[] {
return [...this.data];
}
}
@Service decoratorUsing @Service is the recommended approach for most services. It tells Angular to:
providers array.autoProvided optionIf you don't want to create a singleton of your service, you can set @Service({autoProvided: false}) and declare the service a providers array.
Once a service is created, you can inject it into components, directives, or other services using the inject() function.
import {Component, inject} from '@angular/core';
import {BasicDataStore} from './basic-data-store.service';
@Component({
selector: 'app-example',
template: `
<div>
<p>Data items: {{ dataStore.getData().length }}</p>
<button (click)="dataStore.addData('New Item')">Add Item</button>
</div>
`,
})
export class Example {
// Inject the service as a class field
dataStore = inject(BasicDataStore);
}
Services can inject other services in the exact same way.
import {Injectable, inject} from '@angular/core';
import {AdvancedDataStore} from './advanced-data-store.service';
@Service()
export class BasicDataStore {
// Injecting another service
private advancedDataStore = inject(AdvancedDataStore);
private data: string[] = [];
getData(): string[] {
// Combine data from this service and the injected service
return [...this.data, ...this.advancedDataStore.getData()];
}
}
While @Service covers most scenarios, you may sometimes need:
@Component({ providers: [MyService] }) array and set the autoProvided: false option: @Service({autoProvided: false})