image auteur
Lucas BENTO-VERSACE 6min • 24-06-2021

Angular - Paramétrer l'injection de dépendance avec @Injectable

Angular - Paramétrer l'injection de dépendance avec @Injectable

Bienvenue sur CodeWise ! Si vous êtes nouveau ici, vous voudrez sans doute découvrir notre Starter Kit Angular : il contient une roadmap du parcours d'un dev Angular, ainsi qu'un cookbook des commandes les plus utiles et un extrait de formation. Cliquez ici pour le télécharger (c’est gratuit !)

Dans cet article, vous allez découvrir les notions d'injections de dépendances et comment se servir du décorateur @Injectable d'Angular.

Définition : L’injection de dépendance

L’injection de dépendance est une notion fondamentale du framework Angular. C’est un design pattern implémenté directement par ce framework.

Quand Angular instancie un component, il peut résoudre les dépendances en les injectant via le constructeur du component.

Les attributs des classes de votre projet (component, service ou autres) seront instanciés sans votre intervention. Si l’injection a été configurée, le framework choisit quelle instance utiliser.

Il peut décider de créer une nouvelle instance de l’objet ou bien d'en choisir une déjà existante (principe singleton).

C’est ce que vous allez voir dans cet article.

L’injecteur d’Angular

Angular met à disposition plusieurs injecteurs de dépendance. Comme dit précédemment, leur rôle est d'instancier et de fournir les dépendances demandées par les différentes classes de nos applications.

Chaque injecteur dispose d'une portée qui lui est propre. Cette portée peut-être : l’application entière, un module et/ou un composant.

schéma portée injecteur angular @injectable
Portée des injecteurs Angular

Le décorateur @Injectable

Décorateur : définition

Avant toute chose, qu’est-ce qu’un décorateur ?

Un décorateur est une annotation précédée d’un @.

Son rôle est de factoriser certaines instructions en surchargeant le comportement de base (principe de POO), d’ajouter des métadonnées, des propriétés ou des paramètres à nos classes.

Angular dispose de plusieurs décorateurs pour différentes fonctions : pour la communication inter-component, la résolution de dépendance et beaucoup d’autres.
Vous pouvez même créer vos propres décorateurs !

Le cas du décorateur @Injectable

Revenons à votre décorateur @Injectable. Il permet de rendre votre classe détectable par l’injecteur, donc si vous injectez une dépendance sans ce décorateur, le framework vous retournera une erreur.

Les différents types d’injecteur

Injecteur : root

a) Syntaxe

Dans le décorateur @Injectable de votre service, dans le paramètre “providedIn” inscrivez ”root” :

1
2
3
4
5
6
7
8
import { Injectable } from '@angular/core';
 
@Injectable({
 providedIn: 'root',
})
export class AnyService {
 constructor() { }
}
file.component.ts
b) Cas d’utilisation

Utilisez l’injecteur root lorsque vous souhaitez que les dépendances soient accessibles dans toute l’application. Si dans votre application vous avez besoin d’un service quelconque utilisé dans plusieurs modules, alors il est préférable d’utiliser cette solution.

De plus, il n’y aura qu’une seule instance de ce service (singleton) disponible pour toute l’application. Cela vous évitera une diminution de performance liée à de multiples instanciations inutiles.
c) Exemple

Prenons l’exemple d’une application qui récupère des données via une API. Si ces données sont utilisées dans différents modules, par différents component et par la couche métier, il semble pertinent de rendre disponible l’instance du service à toute l’application.

Injecteur par module

a) Syntaxe

Dans le décorateur @Injectable de votre service, dans le paramètre “providedIn” inscrivez le nom du module dans lequel vous voulez injecter la dépendance :

1
2
3
4
5
6
7
8
9
10
11
12
import { Injectable } from '@angular/core';
import { AnyModule } from './any.module';
import { ANY } from './mock-any';
 
@Injectable({
 // vous déclarez que ce service doit être créé
 // par n'importe quel injecteur qui inclut AnyModule.
 providedIn: AnyModule,
})
export class AnyService {
 getAny() { return ANY; }
}
file.component.ts
b) Cas d'utilisation

Utilisez l’injecteur par module si les dépendances ne doivent être accessibles qu’à certains modules. Les instances seront disponibles uniquement dans les modules déclarés dans l’annotation @injectable. Là aussi, les dépendances seront des singletons (instanciés une seule fois).

c) Exemple

Prenons l’exemple d’une application utilisant un système d’authentification. On trouve dans cette application un module appelé AuthenticationModule.

Dédié à la gestion d’authentification, ce module dispose de plusieurs composants qui ont besoin d’un service d’authentification. Dans ce cas-là, on veut que l’AuthenticationService ne soit accessible que dans ce module afin de restreindre son utilisation aux components dédiés.

On décide alors d’injecter le service via l’injecteur du module AuthenticationModule.

Injecteur par component

a) Syntaxe

Dans le décorateur du component, dans le paramètre “providers” placez entre crochets la liste des dépendances à injecter :

1
2
3
4
5
6
7
8
9
10
11
12
import { Component } from '@angular/core';
import { AnyService } from './any.service';
 
@Component({
 selector: 'app-any',
 providers: [ AnyService ],
 template: `
   ‹h2›My title‹/h2›
   ‹app-any-list›‹/app-any-list›
 `
})
export class AnyComponent { }
file.component.ts
b) Cas d'utilisation

Si vous souhaitez que la dépendance ne soit accessible que dans un seul composant et dans ses composants enfants.

Attention, dans ce cas-ci le component possédera sa propre instance de la dépendance. La dépendance n’est donc plus instanciée comme un singleton ce qui pourrait avoir des répercussions au niveau des performances de votre application.
c) Exemple

Par exemple, un composant d'édition d’utilisateur UserEditorComponent qui a besoin d’un service de mise en cache, doit posséder sa propre instance de UserCacheService. On utilisera donc l’injecteur par component pour ce cas-là.

Conclusion

Désormais vous savez où et comment injecter des services avec Angular. Si vous avez des questions n'hésitez pas à me les poser en commentaire !

Si vous n’êtes pas encore à l’aise avec les notions de services, vous pouvez vous rendre sur cet article : Les services

Sources

Téléchargez votre Starter Kit Angular

Starter Kit Angular

En souscrivant vous recevrez :

  • Une roadmap d'un développeur Angular
  • Un cookbook Angular des commandes les plus utiles
  • Un extrait de formation

100% gratuit.

Auteur

image auteur
Lucas BENTO-VERSACE Alternant chez Codewise / Étudiant en développement web lucas.bentoversace@ynov.com
"Alternant chez Codewise, passioné par l'informatique et les technologies depuis mon plus jeune âge. J'ai découvert le monde du web et depuis je ne m'en lasse pas ! Fan de jeux vidéos, de sports et de musiques. "