Dependency Injection

Each module has an isolated DI container.

Registration Types

class MyModule extends Module {
  @override
  Future<void> onInit() async {
    // Singleton
    di.put<DatabaseService>(DatabaseServiceImpl());
    
    // Factory (new instance each call)
    di.factory<HttpClient>(() => HttpClient());
    
    // Lazy singleton (created on first access)
    di.lazy<CacheService>(() => CacheService());
  }
}

Retrieving Dependencies

// Get instance
final db = di.get<DatabaseService>();

// Check if registered
if (di.has<UserService>()) {
  final user = di.get<UserService>();
}

Override for Testing

void main() {
  test('module with mock', () async {
    final module = MyModule();
    
    // Override dependency
    module.di.override<UserRepository>(MockUserRepository());
    
    await module.initialize();
  });
}

Removing Dependencies

// Remove specific
di.remove<DatabaseService>();

// Clear all
di.clear();