Dependency injection - ApplETS/Notre-Dame GitHub Wiki
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.
✅ 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
Dans (lib/locator.dart)[https://github.com/ApplETS/Notre-Dame/blob/master/lib/locator.dart]
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 ✅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 instanceNouvelle 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)// ❌ MAUVAIS: CourseRepository avant SignetsClientService
locator.registerLazySingleton(() => CourseRepository());
locator.registerLazySingleton(() => SignetsClientService());
// ✅ BON: Dépendances d'abord
locator.registerLazySingleton(() => SignetsClientService());
locator.registerLazySingleton(
() => CourseRepository(
signetsClient: locator<SignetsClientService>(),
),
);// ❌ 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'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());
}- 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