Aller au contenu principal

13-1 À propos de l'injection de dépendances (DI)

L'injection de dépendances permet de fournir à un objet les objets/variables dont il dépend, sans les instancier manuellement.

C'est une forme de délégation: "Injector, s.v.p. instance et gère à ma place les dépendances dont mon objet a besoin!"

Par exemple, en tant normal nous pourrions faire quelque chose comme ceci:

class UneClasse {
private service: ServiceDontJeDepends;

constructor() {
   this.service = new ServiceDontJeDepends();
}
}

L'injection de dépendances nous permet de définir les dépendances d'une classe à même le constructeur:

class UneClasse {    
constructor(private service: ServiceDontJeDepends) { }
}

On délègue alors la création de l'objet au cadriciel. Il est important que le cadriciel en question implémente un mécanisme d'injection de dépendances, autrement il n'y a pas de magie! 😉

L'avantage est, entre autres, une meilleure séparation entre les objets, facilitant les tests unitaires automatisés. De plus, le même objet peut aussi être réutilisé par d'autres classes (instancié une fois, soit un singleton).

Comment cela fonctionne-t-il?

Un conteneur (géré par Angular et appelé Injector) détient une liste des dépendances possibles dans l'application (on doit enregistrer les dépendances que l'on veut rendre disponibles au reste de l'application via un décorateur de classe).

Lorsqu'une classe mentionne une dépendance contenue dans le conteneur via son constructeur, le framework prend la responsabilité de créer l'instance.

Imgur

Pour que cela fonctionne, la classe à être instanciée doit posséder le décorateur @Injectable. C'est ce qui permet de l'enregistrer dans le conteneur (Injector).

Par exemple:

@Injectable({
providedIn: 'root'
})
export class ProjetService {

constructor() { }
}
info

Les services créés par le CLI d'Angular auront ce décorateur automatiquement, donc vous ne devriez pas avoir à l'ajouter manuellement, sauf en rare cas d'exception.