Aller au contenu principal

Consommer un Service (Injection)

Maintenant que ton "Cuisinier" (CatService) est prêt, tes "Serveurs" (Controllers) doivent pouvoir lui parler. On ne fait jamais de new CatService(). On demande au framework de nous le donner.

Il existe deux écoles pour faire ça.

Méthode 1 : Injection par Constructeur (Recommandé ⭐️)

C'est la méthode la plus standard en TypeScript. Le framework analyse les types dans le constructeur et fournit les bonnes instances.

Avantages :

  • Le code est propre et lisible.
  • C'est natif à TypeScript.
  • Idéal pour les tests unitaires (facile à mocker).
@Controller('/cats')
export class CatController {

// TypeScript émet les métadonnées, le framework les lit
// et injecte l'instance unique de CatService ici.
constructor(private catService: CatService) {}

@Get()
getCats() {
return this.catService.findAll();
}
}

Méthode 2 : Injection par Propriété (@Inject)

Parfois, tu ne veux pas (ou ne peux pas) utiliser le constructeur. Par exemple, si tu as de l'héritage complexe ou si tu préfères voir tes dépendances listées comme des propriétés.

Tu dois utiliser le décorateur @Inject(Token) et l'opérateur d'assertion !:.

Syntaxe :

@Inject(ClasseDuService)
private nomPropriete!: ClasseDuService;

Exemple :

import { Controller, Inject, Get } from 'my-fastify-decorators';
import { CatService } from './cat.service';

@Controller('/cats')
export class CatController {

@Inject(CatService)
private catService!: CatService;
// ⚠️ Note le '!' : On promet à TS que le framework va remplir cette case.

@Get()
getCats() {
return this.catService.findAll();
}
}

Injection Service vers Service

C'est la beauté du système "Lego". Un service peut lui-même avoir besoin d'un autre service. Le framework gère l'arbre de dépendances tout seul.

@Service()
export class AuthService {
// AuthService a besoin de UserService pour vérifier le mot de passe
constructor(private userService: UserService) {}

login() {
return this.userService.findUser(...);
}
}