getOrRegisterAsync<T extends Object> method

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

Gets or registers an async 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 - Async function that creates the instance registerAs - Type of registration (factoryAsync, lazySingletonAsync, singletonAsync)

Returns a Future with the dependency instance.

Implementation

Future<T> getOrRegisterAsync<T extends Object>(
  Future<T> Function() instanceCreator,
  RegisterAs registerAs,
) async {
  // Optimized: Check registration once and handle accordingly
  if (!isRegistered<T>()) {
    switch (registerAs) {
      case RegisterAs.factoryAsync:
        // Optimized: Direct async function registration
        registerFactoryAsync<T>(instanceCreator);
        break;
      case RegisterAs.lazySingletonAsync:
        // Optimized: Direct async lazy singleton registration
        registerLazySingletonAsync<T>(instanceCreator);
        break;
      case RegisterAs.singletonAsync:
        // Optimized: Create async instance once and register
        final T instance = await instanceCreator();
        registerSingleton<T>(instance);
        break;
      default:
        throw UnimplementedError(
            'RegisterAs.$registerAs is not implemented for async operations');
    }
  }

  // For singletonAsync, we registered it as a regular singleton, so use get instead of getAsync
  if (registerAs == RegisterAs.singletonAsync) {
    return get<T>();
  }

  return getAsync<T>();
}