Lors de la génération de services dans le CLI d'Angular, des métadonnées supplémentaires sont ajoutées avec une propriété "provided in" dont la valeur par défaut est "Root" pour le décorateur Injectable.
@Injectable({
providedIn: 'root',
})
Que fait exactement providedIn ? Je suppose qu'il s'agit de rendre le service disponible comme un service singleton de type 'global' pour l'ensemble de l'application, cependant, ne serait-il pas plus propre de déclarer de tels services dans le tableau des fournisseurs de l'AppModule ?
UPDATE :
Pour tous les autres, le paragraphe suivant en fournit une autre bonne explication, notamment si vous souhaitez fournir votre service à un module de fonctionnalités uniquement.
Il existe désormais une nouvelle façon, recommandée, d'enregistrer un fournisseur, directement dans le
@Injectable()
en utilisant le nouveau décorateurprovidedIn
attribut. Il accepte'root'
comme valeur ou tout module de votre application. Lorsque vous utilisez'root'
, votreinjectable
sera enregistré en tant que singleton dans l'application, et vous n'avez pas besoin de l'ajouter aux fournisseurs du module Root. De même, si vous utilisezprovidedIn: UsersModule
leinjectable
est enregistré en tant que fournisseur duUsersModule
sans l'ajouter à laproviders
de le module." - https://blog.ninja-squad.com/2018/05/04/what-is-new-angular-6/
UPDATE 2 :
Après une enquête plus approfondie, j'ai décidé qu'il est seulement utile d'avoir providedIn: 'root'
Si vous voulez provide
un service dans un module autre que le module Root, il est préférable d'utiliser le module providers
dans les décorateurs du module de fonctionnalité, sinon vous serez en proie à des dépendances circulaires. Des discussions intéressantes peuvent avoir lieu ici - https://github.com/angular/angular-cli/issues/10170
27 votes
Je pense que vos mises à jour devraient être une réponse (vous pouvez répondre à vos propres questions) au lieu de les ajouter à votre question.
4 votes
La partie la plus importante est SINGLETON, personne n'en parle !