What problem does it solve? Configuring Angular dependency injection correctly—choosing provider scopes, creating injection tokens, and managing singleton versus component-level services—is error-prone without clear patterns, especially with the modern inject() API replacing constructor injection. ## Core Features & Use Cases - Modern inject() Patterns: Replace constructor injection with the inject() function in components and services, including optional, self, skipSelf, and host modifiers. - Injection Tokens & Provider Types: Create InjectionToken instances with factories and configure useClass, useValue, useFactory, useExisting, and multi providers. - Scoped Providers & App Initializers: Configure root, component, and route-level providers, plus provideAppInitializer for async startup logic and runInInjectionContext for programmatic injection. - Use Case: When building a feature that needs a platform-specific storage service, define an abstract Storage class, provide BrowserStorage or ServerStorage via a factory checking PLATFORM_ID, and inject it anywhere with inject(Storage). ## Quick Start Ask the AI to create an Angular service using inject() with an injection token for your API URL and configure it in app.config.ts providers.