Ce schematic convertit les classes @Injectable éligibles vers le décorateur @Service, un raccourci ergonomique pour @Injectable({providedIn: 'root'}).
Il est disponible depuis la v22.1 et ne migre que les classes considérées comme sûres à migrer.
Lancez le schematic avec la commande suivante :
ng generate @angular/core:service
Une classe déclarée avec providedIn: 'root' devient un @Service sans options.
Avant
import {Injectable} from '@angular/core';
@Injectable({providedIn: 'root'})
export class MyService {}
Après
Une classe déclarée sans options n'est pas fournie automatiquement : la migration conserve donc ce comportement avec autoProvided: false.
C'est toujours à vous de l'ajouter à un tableau providers, comme auparavant.
Avant
import {Injectable} from '@angular/core';
@Injectable()
export class MyService {}
Après
Pour plus de détails, consultez Désactiver la fourniture automatique.
Options de configuration
--path
Par défaut, la migration met à jour tout votre workspace Angular CLI, fichiers de test compris. Vous pouvez limiter la migration à un sous-répertoire spécifique avec cette option.
ng generate @angular/core:service --path src/app/sub-component
Limitations
Pour éviter d'introduire des régressions dans votre application, le schematic ignore une classe quand :
- La classe, ou l'ancêtre le plus proche dans votre propre code source qui définit un constructeur, injecte des dépendances via son constructeur.
- Le décorateur
@Injectablereçoit une option autre queprovidedIn. - L'option
providedIna une valeur autre que'root'.
Quand tous les @Injectable d'un fichier sont migrés, la migration supprime l'import de Injectable.
Un fichier qui contient à la fois des classes migrées et des classes ignorées conserve les deux imports.
Si la migration indique qu'elle n'a trouvé aucun fichier à migrer, elle n'a modifié aucun fichier.
Soit elle n'a trouvé aucune classe @Injectable qu'elle pouvait convertir, soit le code est déjà migré.
L'injection par constructeur est la raison la plus fréquente d'une classe ignorée : vous pouvez d'abord lancer la migration vers la fonction inject, puis relancer celle-ci.