Dependency injection - ApplETS/Notre-Dame GitHub Wiki

🔧 Injection de Dépendances (GetIt/Locator)

Vue d'Ensemble

L'injection de dépendances (DI) permet de découpler les classes et facilite les tests.

Le projet utilise GetIt pour l'injection centralisée dans locator.dart.


🎯 Principes

Découplage : Les classes ne créent pas leurs dépendances
Centralisé : Un seul endroit pour configurer les dépendances
Testable : Facile de passer des mocks en test
Lazy Loading : Instances créées seulement quand nécessaire


📋 Configuration du Locator

Dans (lib/locator.dart)[https://github.com/ApplETS/Notre-Dame/blob/master/lib/locator.dart]


📌 Types d'Enregistrement

1. Singleton (Instance Unique)

Une seule instance créée pour toute l'application

locator.registerSingleton<AuthService>(AuthService());

// Accès
final authService = locator<AuthService>();
final authService2 = locator<AuthService>();

// authService == authService2 ✅

2. Lazy Singleton (Création à la Demande)

Instance créée seulement quand demandée

locator.registerLazySingleton<CourseRepository>(
  () => CourseRepository(),
);

// Accès
final repo = locator<CourseRepository>();  // Créée ici
final repo2 = locator<CourseRepository>();  // Même instance

3. Factory

Nouvelle Instance à chaque fois

// Nouvelle instance à chaque demande
locator.registerSingleton<DetailViewModel>(
  (_) => DetailViewModel(),
);

// Accès
final vm1 = locator<DetailViewModel>();
final vm2 = locator<DetailViewModel>();

// vm1 != vm2 ❌ (instances différentes)

⚠️ Pièges Courants

❌ Enregistrement Ordre Important

// ❌ MAUVAIS: CourseRepository avant SignetsClientService
locator.registerLazySingleton(() => CourseRepository());
locator.registerLazySingleton(() => SignetsClientService());

// ✅ BON: Dépendances d'abord
locator.registerLazySingleton(() => SignetsClientService());
locator.registerLazySingleton(
  () => CourseRepository(
    signetsClient: locator<SignetsClientService>(),
  ),
);

❌ Créer Instances Manuellement

// ❌ MAUVAIS: Créer une instance au lieu d'utiliser le locator
class MyViewModel {
  final repository = CourseRepository();  // ❌
}

// ✅ BON: Utiliser l'injection
class MyViewModel {
  final repository = locator<CourseRepository>();  // ✅
}

❌ Oublier d'Initialiser les Services

// ❌ Oublier d'appeler setupLocator() dans main()
Future<void> main() {
  // setupLocator();  ← Oublié!
  runApp(const MyApp());
}

// ✅ Toujours appeler setupLocator() en premier
Future<void> main() async {
  setupLocator();  // ← Important!
  runApp(const MyApp());
}

✅ Checklist pour Nouvelle Dépendance

  • Créer la classe
  • Ajouter le registrement dans setupLocator()
  • Respecter l'ordre des dépendances
  • Tester avec des mocks
  • Documenter la dépendance
  • Éviter les dépendances circulaires

Cette page a été en partie générée avec l'aide de Claude Haiku 4.5

⚠️ **GitHub.com Fallback** ⚠️