package at.mocode.di import kotlin.reflect.KClass /** * Service Locator interface for dependency injection. * Provides a centralized way to register and resolve dependencies across the application. */ interface ServiceLocator { /** * Register a service instance with the locator */ fun register(serviceClass: KClass, instance: T) /** * Register a service factory with the locator */ fun register(serviceClass: KClass, factory: () -> T) /** * Resolve a service instance from the locator */ fun resolve(serviceClass: KClass): T /** * Check if a service is registered */ fun isRegistered(serviceClass: KClass): Boolean /** * Clear all registered services */ fun clear() } /** * Default implementation of ServiceLocator */ class DefaultServiceLocator : ServiceLocator { private val instances = mutableMapOf, Any>() private val factories = mutableMapOf, () -> Any>() override fun register(serviceClass: KClass, instance: T) { instances[serviceClass] = instance factories.remove(serviceClass) // Remove factory if exists } override fun register(serviceClass: KClass, factory: () -> T) { factories[serviceClass] = factory instances.remove(serviceClass) // Remove instance if exists } @Suppress("UNCHECKED_CAST") override fun resolve(serviceClass: KClass): T { // First check if we have a cached instance instances[serviceClass]?.let { return it as T } // Then check if we have a factory factories[serviceClass]?.let { factory -> val instance = factory() as T instances[serviceClass] = instance // Cache the instance return instance } throw IllegalArgumentException("Service ${serviceClass.simpleName} is not registered") } override fun isRegistered(serviceClass: KClass): Boolean { return instances.containsKey(serviceClass) || factories.containsKey(serviceClass) } override fun clear() { instances.clear() factories.clear() } } /** * Global service locator instance */ object ServiceRegistry { private var _serviceLocator: ServiceLocator = DefaultServiceLocator() val serviceLocator: ServiceLocator get() = _serviceLocator /** * Set a custom service locator implementation */ fun setServiceLocator(locator: ServiceLocator) { _serviceLocator = locator } /** * Reset to default service locator */ fun reset() { _serviceLocator = DefaultServiceLocator() } } // Kotlin extension functions for easier usage inline fun ServiceLocator.register(instance: T) { register(T::class, instance) } inline fun ServiceLocator.register(noinline factory: () -> T) { register(T::class, factory) } inline fun ServiceLocator.resolve(): T { return resolve(T::class) } inline fun ServiceLocator.isRegistered(): Boolean { return isRegistered(T::class) }