analogjs/angular-di

Implémenter l'injection de dépendances dans Angular v20+ en utilisant inject(), les tokens d'injection et la configuration des providers. Utilisé pour l'architecture de services, la fourniture de dépendances à différents niveaux, la création de tokens injectables et la gestion des services singleton ou scopés.

Qu'est-ce que angular-di ?

Cette compétence guide les développeurs dans l'implémentation de l'injection de dépendances (DI) dans Angular v20 et versions ultérieures. Elle couvre l'utilisation de la fonction `inject()`, des tokens d'injection (`InjectionToken`), de la configuration des `providers` (avec `providedIn`, `useClass`, `useExisting`, `useFactory`, `useValue`), et la hiérarchie des injecteurs (platforme, module, composant). Elle est utile pour concevoir une architecture de services bien structurée, gérer la portée des dépendances (singleton, limitée à un composant), et créer des tokens typés pour des dépendances non-class (comme des chaînes, objets, fonctions). Compatible avec tout environnement utilisant Angular (CLI, Nx, etc.), cette compétence s'applique lors de la création de services, de la configuration de providers dans les décorateurs `@Injectable` ou les tableaux `providers`, de l'utilisation de tokens d'injection, et de la compréhension de la hiérarchie des injecteurs Angular.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/analogjs/angular-skills/tree/main/skills/angular-di

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait angular-di ?

Implémenter l'injection de dépendances dans Angular v20+ en utilisant inject(), les tokens d'injection et la configuration des providers. Utilisé pour l'architecture de services, la fourniture de dépendances à différents niveaux, la création de tokens injectables et la gestion des services singleton ou scopés. Se déclenche lors de la création de services, de la configuration de providers, de l'utilisation de tokens d'injection ou de la compréhension de la hiérarchie des injecteurs.

Vue d'ensemble

Cette compétence couvre les aspects essentiels du système d'injection de dépendances d'Angular dans les versions 20 et ultérieures. L'API DI moderne repose principalement sur la fonction inject() (introduite comme stable dans Angular 14) et les tokens d'injection typés.

Concepts clés

  • inject() : La fonction principale pour obtenir des dépendances. Elle remplace l'injection par constructeur dans la plupart des cas et est disponible dans tous les contextes d'injection (constructeurs de services, factories, guards, resolvers).
  • InjectionToken<T> : Crée un token typé pour les dépendances qui ne sont pas des classes (par exemple, des configurations, des chaînes, des objets).
  • providedIn : Définit la visibilité et le cycle de vie d'un service. Les options courantes incluent 'root' (singleton applicatif), le nom d'un NgModule spécifique, ou 'platform' (pour les environnements multi-applications).
  • Providers : Configurés via les décorateurs @Injectable, les tableaux providers des NgModule, ou les providers des @Component/@Directive.

Utilisation courante

Créer un service avec providedIn: 'root'

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class LoggerService {
  log(message: string) {
    console.log(message);
  }
}

Utiliser inject() au lieu de l'injection par constructeur

import { inject, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { LoggerService } from './logger.service';

@Injectable()
export class DataService {
  private http = inject(HttpClient);
  private logger = inject(LoggerService);

  fetchData() {
    this.logger.log('Récupération des données...');
    return this.http.get('/api/data');
  }
}

Créer et utiliser un InjectionToken

import { InjectionToken, inject, Injectable } from '@angular/core';

export interface AppConfig {
  apiUrl: string;
  timeout: number;
}

export const APP_CONFIG = new InjectionToken<AppConfig>('app.config');

@Injectable()
export class ConfigService {
  private config = inject(APP_CONFIG);

  getApiUrl(): string {
    return this.config.apiUrl;
  }
}

Fournir le token dans un module ou un composant :

import { NgModule } from '@angular/core';
import { APP_CONFIG } from './app-config.token';

@NgModule({
  providers: [
    {
      provide: APP_CONFIG,
      useValue: {
        apiUrl: 'https://api.example.com',
        timeout: 5000
      }
    }
  ]
})
export class AppModule { }

Provider avec useFactory

import { inject, InjectionToken } from '@angular/core';
import { HttpClient } from '@angular/common/http';

export interface CacheService {
  get(key: string): Promise<any>;
  set(key: string, value: any): void;
}

export const CACHE_SERVICE = new InjectionToken<CacheService>('cache.service', {
  factory: () => {
    const http = inject(HttpClient);
    return {
      get: async (key: string) => {
        return http.get(`/cache/${key}`).toPromise();
      },
      set: (key: string, value: any) => {
        // Logique de cache local
        localStorage.setItem(key, JSON.stringify(value));
      }
    };
  }
});

Hiérarchie des injecteurs

Les injecteurs Angular suivent une hiérarchie :

  1. Injecteur de plateforme : Singleton pour toute l'application (rarement utilisé).
  2. Injecteur racine (ModuleInjector) : Fourni via providedIn: 'root' ou NgModule.providers.
  3. Injecteur d'élément (ElementInjector) : Associé à chaque composant/directive via leurs providers.
  4. Injecteur nulle (NullInjector) : L'injecteur le plus haut ; lève une erreur si aucune dépendance n'est trouvée.

Un service défini dans providers d'un composant est unique pour ce composant et ses enfants. Un service défini avec providedIn: 'root' est un singleton partagé dans toute l'application.

Meilleures pratiques

  • Préférer inject() à l'injection par constructeur pour une meilleure testabilité et flexibilité, surtout dans les composants et directives.
  • Utiliser InjectionToken pour les dépendances non-class avec des valeurs de configuration type-safe.
  • Éviter les singletons globaux abusifs : utiliser providedIn au niveau des composants pour des données limitées à un contexte (par exemple, un état local).
  • Organiser les providers par fonctionnalité dans des NgModule dédiés ou des standalone components.
  • Documenter les tokens d'injection avec des noms descriptifs pour faciliter le débogage.

Individual skills in this repo

This repo contains 9 individual skills — each has its own dedicated page.

analogjs/angular-component

Create modern Angular standalone components following v20+ best practices. Use for building UI components with signal-based inputs/outputs, OnPush change detection, host bindings, content projection, and lifecycle hooks. Triggers on component creation, refactoring class-based inputs to signals, adding host bindings, or implementing accessible interactive components.

analogjs/angular-directives

Create custom directives in Angular v20+ for DOM manipulation and behavior extension. Use for attribute directives that modify element behavior/appearance, structural directives for portals/overlays, and host directives for composition. Triggers on creating reusable DOM behaviors, extending element functionality, or composing behaviors across components. Note - use native @if/@for/@switch for control flow, not custom structural directives.

analogjs/angular-forms

Build signal-based forms in Angular v21+ using the new Signal Forms API. Use for form creation with automatic two-way binding, schema-based validation, field state management, and dynamic forms. Triggers on form implementation, adding validation, creating multi-step forms, or building forms with conditional fields. Signal Forms are experimental but recommended for new Angular projects. Don't use for template-driven forms without signals or third-party form libraries like Formly or ngx-formly.

analogjs/angular-http

Implement HTTP data fetching in Angular v20+ using resource(), httpResource(), and HttpClient. Use for API calls, data loading with signals, request/response handling, and interceptors. Triggers on data fetching, API integration, loading states, error handling, or converting Observable-based HTTP to signal-based patterns.

analogjs/angular-routing

Implement routing in Angular v20+ applications with lazy loading, functional guards, resolvers, and route parameters. Use for navigation setup, protected routes, route-based data loading, and nested routing. Triggers on route configuration, adding authentication guards, implementing lazy loading, or reading route parameters with signals.

analogjs/angular-signals

Implement signal-based reactive state management in Angular v20+. Use for creating reactive state with signal(), derived state with computed(), dependent state with linkedSignal(), and side effects with effect(). Triggers on state management questions, converting from BehaviorSubject/Observable patterns to signals, or implementing reactive data flows.

analogjs/angular-ssr

Implement server-side rendering and hydration in Angular v20+ using @angular/ssr. Use for SSR setup, hydration strategies, prerendering static pages, and handling browser-only APIs. Triggers on SSR configuration, fixing hydration mismatches, prerendering routes, or making code SSR-compatible.

analogjs/angular-testing

Write unit and integration tests for Angular v20+ applications using Vitest or Jasmine with TestBed and modern testing patterns. Use for testing components with signals, OnPush change detection, services with inject(), and HTTP interactions. Triggers on test creation, testing signal-based components, mocking dependencies, or setting up test infrastructure. Don't use for E2E testing with Cypress or Playwright, or for testing non-Angular JavaScript/TypeScript code.

analogjs/angular-tooling

Use Angular CLI and development tools effectively in Angular v20+ projects. Use for project setup, code generation, building, testing, and configuration. Triggers on creating new projects, generating components/services/modules, configuring builds, running tests, or optimizing production builds. Don't use for Nx workspace commands, custom Webpack configurations, or non-Angular CLI build systems like Vite standalone or esbuild direct usage.

Skills associés