Angular Advanced Dependency Injection उन scenarios को cover करता है जहाँ simple providedIn: 'root' और basic providers sufficient नहीं होते। Large-scale applications, enterprise systems और highly configurable architectures में Angular DI के advanced features का deep understanding जरूरी होता है।
इस chapter में हम Angular Advanced DI को hierarchy, resolution control, advanced tokens और real-world patterns के साथ detail में समझेंगे।
Hierarchical Injectors Deep Dive
Angular का DI system hierarchical होता है। इसका मतलब है कि हर injector का एक parent होता है।
Injector levels:
- Root Injector
- Environment Injector
- Component Injector
जब Angular किसी dependency को resolve करता है, तो वह:
- Current injector से start करता है
- Parent injectors में climb करता है
- Root तक search करता है
यह behavior advanced DI patterns की foundation है।
Environment Injector
Modern Angular में Environment Injector introduced हुआ है।
Use cases:
- Standalone APIs
- Feature-level providers
- Lazy-loaded configurations
bootstrapApplication(AppComponent, {
providers: [AuthService]
});
यह providers application environment scope में register करता है।
Injector Resolution Control
Angular decorators के through resolution control allow करता है।
@Self
Dependency सिर्फ current injector से resolve होगी।
constructor(@Self() private service: LocalService) {}
Parent injector में service होने पर भी use नहीं होगी।
@SkipSelf
Current injector skip करके parent से resolve करता है।
constructor(@SkipSelf() private parentService: ParentService) {}
@Host
Resolution host component तक limited करता है।
constructor(@Host() private hostService: HostService) {}
Complex component trees में helpful है।
@Optional
Dependency optional बनाता है।
constructor(@Optional() private logger?: LoggerService) {}
Provider missing होने पर error नहीं आएगा।
Injector Tree Override Patterns
Child component parent provider को override कर सकता है।
@Component({
providers: [
{ provide: LoggerService, useClass: DebugLogger }
]
})
यह pattern feature-level customization के लिए use होता है।
Custom Injector Creation
Rare cases में manually injector create किया जा सकता है।
const injector = Injector.create({
providers: [
{ provide: ApiService, useClass: ApiService }
]
});
Use cases:
- Dynamic plugin systems
- Isolated logic execution
Manual injector advanced और careful usage demand करता है।
inject() Function (Modern DI)
Angular में constructor-less injection possible है।
const api = inject(ApiService);
Use cases:
- Functional guards
- Standalone utilities
- Signals-based logic
यह functional programming patterns को enable करता है।
DI in Functional APIs
Guards example:
export const authGuard = () => {
const auth = inject(AuthService);
return auth.isLoggedIn();
};
Modern Angular APIs heavily use inject().
Multi Providers Advanced Pattern
Multi providers execution pipeline बना सकते हैं।
export const HANDLERS = new InjectionToken<Handler[]>('HANDLERS');
providers: [
{ provide: HANDLERS, useClass: AHandler, multi: true },
{ provide: HANDLERS, useClass: BHandler, multi: true }
]
यह plugin-based architecture enable करता है।
Aliasing Providers
Same instance को different tokens से expose करना।
providers: [
{ provide: OldService, useExisting: NewService }
]
Backward compatibility में helpful है।
Lazy-Loaded Modules और DI
Lazy-loaded modules का अपना injector होता है।
Effects:
- Services isolate हो सकती हैं
- State duplication हो सकता है
providedIn: 'any'
इससे हर lazy module को new instance मिलता है।
Tree-Shakable Advanced Providers
Advanced provider options:
@Injectable({ providedIn: 'platform' })
Scopes:
- root
- platform
- any
यह advanced bundle optimization में use होता है।
DI with Configuration Objects
Complex config DI pattern:
export interface FeatureConfig {
enabled: boolean;
}
export const FEATURE_CONFIG =
new InjectionToken<FeatureConfig>('FEATURE_CONFIG');
यह configuration-driven apps के लिए ideal है।
Circular Dependency Detection
Angular runtime पर circular dependencies detect करता है।
Symptoms:
- Injection errors
- App bootstrap failure
Solutions:
- Shared abstraction layer
- Factory-based indirection
- Logic refactoring
Performance Considerations
DI misuse performance impact डाल सकता है।
Best practices:
- Unnecessary providers avoid करें
- Component-level providers limited रखें
- Singleton services prefer करें
- Multi providers heavy logic से बचें
Testing Insight (DI Perspective)
Testing में DI powerful role play करता है।
providers: [
{ provide: ApiService, useClass: MockApiService }
]
DI test isolation और mocking को simple बनाता है।
Common Advanced DI Mistakes
- Overusing component-level providers
- Circular provider chains
- Using string tokens
- Global state accidentally duplicating
Real-World Advanced DI Use Cases
Angular Advanced DI use होता है:
- Plugin-based systems
- Feature flag engines
- Large micro-frontend apps
- Configurable enterprise platforms
Angular Advanced DI Angular architecture का most powerful लेकिन most misused हिस्सा भी है। सही तरीके से use करने पर यह Angular applications को highly flexible और scalable बनाता है। अगले chapter में हम Angular State Management को detail में cover करेंगे, जहाँ services, signals और RxJS के साथ state patterns discuss होंगे।
