getOrRegister<T extends Object> method

T getOrRegister<T extends Object>(
  1. T instanceCreator(),
  2. RegisterAs registerAs
)

Gets or registers a dependency with optimized lazy loading.

This method checks if a dependency is already registered and either returns the existing instance or registers a new one based on the specified type.

instanceCreator - Function that creates the instance registerAs - Type of registration (factory, singleton, lazySingleton, etc.)

Returns the dependency instance.

Implementation

T getOrRegister<T extends Object>(
  T Function() instanceCreator,
  RegisterAs registerAs,
) {
  // Optimized: Check registration once and handle accordingly
  if (!isRegistered<T>()) {
    switch (registerAs) {
      case RegisterAs.singleton:
        // Optimized: Create instance once and register
        registerSingleton<T>(instanceCreator());
        break;
      case RegisterAs.factory:
        // Optimized: Direct function registration without extra wrapping
        registerFactory<T>(instanceCreator);
        break;
      case RegisterAs.lazySingleton:
        // Optimized: Direct function registration without extra wrapping
        registerLazySingleton<T>(instanceCreator);
        break;
      default:
        throw UnimplementedError('RegisterAs.$registerAs is not implemented');
    }
  }

  return get<T>();
}