You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudsolutions-atoms/lib/core/di/service_locator.dart

93 lines
3.0 KiB
Dart

import 'package:get_it/get_it.dart';
import 'package:test_sa/modules/cx_module/chat/services/signalr_service.dart';
import 'package:test_sa/modules/cx_module/chat/call/services/webrtc_service.dart';
import 'package:test_sa/modules/cx_module/chat/services/call_manager.dart';
import 'package:test_sa/modules/cx_module/chat/call/services/call_notification_service.dart';
import 'dart:developer';
/// Global service locator instance
final getIt = GetIt.instance;
/// Setup dependency injection
/// This is called ONCE during app startup in the MAIN ISOLATE ONLY
/// NEVER call this from background isolate
Future<void> setupServiceLocator() async {
await _registerServices();
}
/// Internal helper to register services with duplicate protection
Future<void> _registerServices() async {
// 1. SignalR Service
if (!getIt.isRegistered<SignalRService>()) {
getIt.registerLazySingleton<SignalRService>(() => SignalRService());
} else {
log(' ⚠️ SignalRService already registered, skipping', name: 'ServiceLocator');
}
// 2. WebRTC Service
if (!getIt.isRegistered<WebRTCService>()) {
getIt.registerLazySingleton<WebRTCService>(() => WebRTCService());
} else {
log(' ⚠️ WebRTCService already registered, skipping', name: 'ServiceLocator');
}
// 3. CallManager (depends on SignalRService, WebRTCService)
if (!getIt.isRegistered<CallManager>()) {
getIt.registerLazySingleton<CallManager>(() => CallManager());
} else {
log(' ⚠️ CallManager already registered, skipping', name: 'ServiceLocator');
}
// 4. CallNotificationService (depends on CallManager)
if (!getIt.isRegistered<CallNotificationService>()) {
getIt.registerLazySingleton<CallNotificationService>(() => CallNotificationService());
} else {
log(' ⚠️ CallNotificationService already registered, skipping', name: 'ServiceLocator');
}
// Verify all critical dependencies are available
_verifyDependencies();
}
/// Verify that all required dependencies are registered
void _verifyDependencies() {
final dependencies = <Type>[
SignalRService,
WebRTCService,
CallManager,
CallNotificationService,
];
bool allRegistered = true;
for (final type in dependencies) {
if (getIt.isRegistered(type: type)) {
log('$type is registered', name: 'ServiceLocator');
} else {
log('$type is NOT registered', name: 'ServiceLocator');
allRegistered = false;
}
}
if (allRegistered) {
} else {
log('❌ [DI] Some dependencies are missing!', name: 'ServiceLocator');
throw StateError('Required dependencies are not registered in GetIt');
}
}
/// Reset all communication services
/// Used for logout or testing
Future<void> resetServices() async {
try {
if (getIt.isRegistered<CallManager>()) {
await getIt<CallManager>().reset();
}
if (getIt.isRegistered<SignalRService>()) {
await getIt<SignalRService>().reset();
}
} catch (e) {
log('❌ [DI] Error resetting services: $e', name: 'ServiceLocator');
}
}