mirror of
https://github.com/angular/angular
synced 2026-05-24 09:28:37 +00:00
Includes:
- Imports and setup instructions
- Validation examples (sync, async, conditional)
- FieldState vs FormField distinction
- Common pitfalls and best practices
- Full-featured example application
(cherry picked from commit ed150e52d1)
2.2 KiB
2.2 KiB
Defining Dependency Providers
Angular offers automatic and manual ways to provide dependencies to its Dependency Injection (DI) system.
Automatic Provision
The most common way to provide a service is using providedIn: 'root' on an @Injectable().
InjectionToken
Use InjectionToken for non-class dependencies (configuration objects, functions, primitives). An InjectionToken can also be automatically provided.
import {InjectionToken} from '@angular/core';
export interface AppConfig {
apiUrl: string;
}
export const APP_CONFIG = new InjectionToken<AppConfig>('app.config', {
providedIn: 'root',
factory: () => ({apiUrl: 'https://api.example.com'}),
});
Manual Provision
You use the providers array when a service lacks providedIn, when you want a new instance for a specific component, or when configuring runtime values.
@Component({
providers: [
// Shorthand for { provide: LocalService, useClass: LocalService }
LocalService,
// useClass: Swap implementations
{provide: Logger, useClass: BetterLogger},
// useValue: Provide static values
{provide: API_URL_TOKEN, useValue: 'https://api.example.com'},
// useFactory: Generate value dynamically
{
provide: ApiClient,
useFactory: (http = inject(HttpClient)) => new ApiClient(http),
},
// useExisting: Create an alias
{provide: OldLogger, useExisting: NewLogger},
// multi: Provide multiple values for the same token as an array
{provide: INTERCEPTOR_TOKEN, useClass: AuthInterceptor, multi: true},
],
})
export class Example {}
Scopes of Providers
- Application Bootstrap: Global singletons. Use for HTTP clients, logging, or app-wide config.
- Component/Directive: Isolated instances. Use for component-specific state or forms. Services are destroyed when the component is destroyed.
- Route: Feature-specific services loaded only with specific routes.
Library Pattern: provide* functions
Library authors should export functions that return provider arrays to encapsulate configuration:
export function provideAnalytics(config: AnalyticsConfig): Provider[] {
return [{provide: ANALYTICS_CONFIG, useValue: config}, AnalyticsService];
}