mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-05-13 16:13:03 +08:00
2.0 KiB
2.0 KiB
Hierarchical Injectors
Angular's dependency injection system is hierarchical, meaning services can be scoped to different levels of the application.
Types of Injector Hierarchies
EnvironmentInjectorHierarchy: Configured via@Injectable({ providedIn: 'root' })orApplicationConfig.providersduring bootstrap. These are global singletons.ElementInjectorHierarchy: Created implicitly at each DOM element. Configured via theprovidersorviewProvidersarray in@Component()or@Directive().
Resolution Rules
When a dependency is requested, Angular resolves it in two phases:
- It searches up the
ElementInjectortree, starting from the requesting component/directive up to the root element. - If not found, it searches the
EnvironmentInjectortree, starting from the closest environment injector up to the root. - If still not found, it throws an error (unless marked optional).
Resolution Modifiers
You can alter how Angular searches for a dependency using the options object in inject():
optional: If the dependency isn't found, returnnullinstead of throwing an error.self: Only check the currentElementInjector. Do not look up the parent tree.skipSelf: Start searching in the parentElementInjector, skipping the current element.host: Stop searching when reaching the host component's view boundary.
@Component({...})
export class Example {
// Returns null if not found instead of crashing
optionalService = inject(MyService, { optional: true });
// Skips this component's providers, looks at parent
parentService = inject(ParentService, { skipSelf: true });
}
providers vs viewProviders
When providing a service at the component level:
providers: The service is available to the component, its view (template), and any projected content (<ng-content>).viewProviders: The service is available to the component and its view, but NOT to projected content. Use this to isolate services from content passed in by consumers.