CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-io-insert-koin--koin-core-jvm

Core dependency injection framework for Kotlin multiplatform applications with DSL-based configuration and type-safe dependency resolution.

Pending
Overview
Eval results
Files

component-integration.mddocs/

Component Integration & Injection

Component integration interfaces and extension functions for seamless dependency injection into classes and objects. Provides both lazy and direct injection patterns with full type safety.

Capabilities

KoinComponent Interface

Base interface for classes that need dependency injection capabilities.

/**
 * Base component interface for Koin integration
 * Provides access to the Koin container for dependency resolution
 */
interface KoinComponent {
    /**
     * Get the Koin instance
     * @return Current Koin instance
     */
    fun getKoin(): Koin
}

Usage Examples:

import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.koin.core.component.get

class UserController : KoinComponent {
    // Lazy injection - resolved on first access
    private val userService: UserService by inject()
    
    // Direct injection - resolved immediately
    private val logger = get<Logger>()
    
    fun createUser(userData: UserData): User {
        logger.info("Creating user")
        return userService.create(userData)
    }
}

class DataProcessor : KoinComponent {
    override fun getKoin(): Koin {
        // Custom Koin instance if needed
        return customKoinInstance
    }
}

Lazy Dependency Injection

Inject dependencies lazily using delegate properties.

/**
 * Lazy inject dependency with optional qualifier and parameters
 * @param qualifier - Optional qualifier to distinguish instances
 * @param mode - Thread safety mode for lazy initialization
 * @param parameters - Optional parameters for dependency creation
 * @return Lazy delegate for the dependency
 */
inline fun <reified T> KoinComponent.inject(
    qualifier: Qualifier? = null,
    mode: LazyThreadSafetyMode = LazyThreadSafetyMode.SYNCHRONIZED,
    noinline parameters: ParametersDefinition? = null
): Lazy<T>

/**
 * Lazy inject dependency with nullable result
 * @param qualifier - Optional qualifier to distinguish instances
 * @param mode - Thread safety mode for lazy initialization  
 * @param parameters - Optional parameters for dependency creation
 * @return Lazy delegate for the nullable dependency
 */
inline fun <reified T> KoinComponent.injectOrNull(
    qualifier: Qualifier? = null,
    mode: LazyThreadSafetyMode = LazyThreadSafetyMode.SYNCHRONIZED,
    noinline parameters: ParametersDefinition? = null
): Lazy<T?>

Usage Examples:

import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.koin.core.component.injectOrNull
import org.koin.core.qualifier.named

class OrderService : KoinComponent {
    // Basic lazy injection
    private val userService: UserService by inject()
    
    // Injection with qualifier
    private val primaryDb: Database by inject(named("primary"))
    private val cacheDb: Database by inject(named("cache"))
    
    // Injection with parameters
    private val apiClient: ApiClient by inject {
        parametersOf("https://api.example.com", 30)
    }
    
    // Nullable injection
    private val optionalService: OptionalService? by injectOrNull()
    
    // Non-synchronized lazy injection for performance
    private val logger: Logger by inject(mode = LazyThreadSafetyMode.NONE)
    
    fun processOrder(orderId: String) {
        logger.info("Processing order $orderId")
        val user = userService.findById(orderId)
        // Dependencies resolved on first access
    }
}

Direct Dependency Retrieval

Get dependencies immediately without lazy initialization.

/**
 * Get dependency directly from container
 * @param qualifier - Optional qualifier to distinguish instances
 * @param parameters - Optional parameters for dependency creation
 * @return Resolved dependency instance
 */
inline fun <reified T> KoinComponent.get(
    qualifier: Qualifier? = null,
    noinline parameters: ParametersDefinition? = null
): T

/**
 * Get dependency with nullable result
 * @param qualifier - Optional qualifier to distinguish instances
 * @param parameters - Optional parameters for dependency creation
 * @return Resolved dependency instance or null if not found
 */
inline fun <reified T> KoinComponent.getOrNull(
    qualifier: Qualifier? = null,
    noinline parameters: ParametersDefinition? = null
): T?

/**
 * Get all instances of a given type
 * @return List of all resolved instances
 */
inline fun <reified T> KoinComponent.getAll(): List<T>

Usage Examples:

import org.koin.core.component.KoinComponent
import org.koin.core.component.get
import org.koin.core.component.getOrNull
import org.koin.core.component.getAll
import org.koin.core.qualifier.named

class ServiceManager : KoinComponent {
    
    fun initializeServices() {
        // Direct retrieval
        val logger = get<Logger>()
        logger.info("Initializing services")
        
        // Retrieval with qualifier
        val primaryDb = get<Database>(named("primary"))
        val cacheDb = get<Database>(named("cache"))
        
        // Retrieval with parameters
        val httpClient = get<HttpClient> {
            parametersOf("https://api.example.com", timeout = 30)
        }
        
        // Nullable retrieval
        val optionalService = getOrNull<OptionalService>()
        optionalService?.initialize()
        
        // Get all instances
        val allValidators = getAll<Validator>()
        allValidators.forEach { it.configure() }
    }
}

Property Injection

Inject dependencies into mutable properties.

/**
 * Inject dependency into mutable property
 * @param qualifier - Optional qualifier to distinguish instances
 * @param parameters - Optional parameters for dependency creation
 */
fun <T> KMutableProperty0<T>.inject(
    qualifier: Qualifier? = null,
    parameters: ParametersDefinition? = null
)

/**
 * Inject dependency into mutable property using specific Koin instance
 * @param koin - Koin instance to use for injection
 * @param qualifier - Optional qualifier to distinguish instances
 * @param parameters - Optional parameters for dependency creation
 */
fun <T> KMutableProperty0<T>.inject(
    koin: Koin,
    qualifier: Qualifier? = null,
    parameters: ParametersDefinition? = null
)

/**
 * Inject dependency into mutable property using specific scope
 * @param scope - Scope to use for injection
 * @param qualifier - Optional qualifier to distinguish instances
 * @param parameters - Optional parameters for dependency creation
 */
fun <T> KMutableProperty0<T>.inject(
    scope: Scope,
    qualifier: Qualifier? = null,
    parameters: ParametersDefinition? = null
)

Usage Examples:

import org.koin.ext.inject
import org.koin.core.component.KoinComponent

class ConfigurableService : KoinComponent {
    // Mutable properties for injection
    lateinit var logger: Logger
    lateinit var database: Database
    
    fun configure() {
        // Inject into properties
        ::logger.inject()
        ::database.inject(named("primary"))
        
        // Now properties are initialized
        logger.info("Service configured")
    }
}

// Standalone property injection
class GlobalConfig {
    lateinit var appSettings: AppSettings
    
    fun initialize(koin: Koin) {
        ::appSettings.inject(koin)
    }
}

KoinScopeComponent Interface

Component interface for classes that work with specific scopes.

/**
 * Scoped component interface extending KoinComponent
 * Provides direct access to a specific scope
 */
interface KoinScopeComponent : KoinComponent {
    /**
     * The scope associated with this component
     */
    val scope: Scope
}

Usage Examples:

import org.koin.core.component.KoinScopeComponent
import org.koin.core.scope.Scope
import org.koin.core.qualifier.named

class UserSessionComponent(override val scope: Scope) : KoinScopeComponent {
    // Inject from component's scope
    private val userPreferences: UserPreferences by scope.inject()
    private val sessionData: SessionData by scope.inject()
    
    fun getUserData(): UserData {
        return UserData(
            preferences = userPreferences,
            session = sessionData
        )
    }
}

// Scope creation and component usage
class UserController : KoinComponent {
    fun createUserSession(userId: String): UserSessionComponent {
        val userScope = getKoin().createScope(userId, named<UserScope>())
        return UserSessionComponent(userScope)
    }
}

Scope Extension Functions

Extension functions for creating and managing component scopes.

/**
 * Create a new scope for the component
 * @param scopeId - Unique identifier for the scope
 * @param qualifier - Scope qualifier/type
 * @return New scope instance
 */
fun KoinScopeComponent.createScope(
    scopeId: String = generateId(),
    qualifier: Qualifier
): Scope

/**
 * Get existing scope or null
 * @param scopeId - Scope identifier
 * @param qualifier - Scope qualifier/type
 * @return Existing scope or null
 */  
fun KoinScopeComponent.getScopeOrNull(
    scopeId: String,
    qualifier: Qualifier
): Scope?

/**
 * Create scope lazily
 * @param scopeId - Scope identifier
 * @param qualifier - Scope qualifier/type
 * @return Lazy delegate for scope
 */
fun KoinScopeComponent.newScope(
    scopeId: String = generateId(),
    qualifier: Qualifier
): Lazy<Scope>

/**
 * Get existing scope or create new one
 * @param scopeId - Scope identifier  
 * @param qualifier - Scope qualifier/type
 * @return Existing or new scope
 */
fun KoinScopeComponent.getOrCreateScope(
    scopeId: String = generateId(),
    qualifier: Qualifier
): Scope

Usage Examples:

import org.koin.core.component.KoinScopeComponent
import org.koin.core.component.createScope
import org.koin.core.component.getOrCreateScope
import org.koin.core.qualifier.named

class FeatureComponent : KoinScopeComponent {
    // Lazy scope creation
    override val scope: Scope by newScope(qualifier = named<FeatureScope>())
    
    // Alternative: explicit scope management
    private val featureScope = createScope("feature-123", named<FeatureScope>())
    
    fun processFeature() {
        // Use scoped dependencies
        val processor = scope.get<FeatureProcessor>()
        processor.process()
    }
    
    fun cleanup() {
        scope.close()
    }
}

Types

typealias ParametersDefinition = () -> ParametersHolder

class Koin {
    inline fun <reified T> inject(
        qualifier: Qualifier? = null,
        mode: LazyThreadSafetyMode = LazyThreadSafetyMode.SYNCHRONIZED,
        noinline parameters: ParametersDefinition? = null
    ): Lazy<T>
    
    inline fun <reified T> get(
        qualifier: Qualifier? = null,
        noinline parameters: ParametersDefinition? = null
    ): T
    
    fun createScope(scopeId: String, qualifier: Qualifier): Scope
    fun getScope(scopeId: String): Scope
    fun deleteScope(scopeId: String)
    fun close()
}

enum class LazyThreadSafetyMode {
    SYNCHRONIZED, PUBLICATION, NONE
}

Install with Tessl CLI

npx tessl i tessl/maven-io-insert-koin--koin-core-jvm

docs

application-setup.md

component-integration.md

configuration-logging.md

constructor-reference.md

index.md

java-interop.md

module-definition.md

property-management.md

qualifiers-parameters.md

scope-management.md

tile.json