Skip to main content

DI Module

Dependency injection module providing SDK initialization, Koin module wiring, and Compose injection helpers.

implementation("com.github.wahidabd.miru-sdk:di:<version>")

MiruSdkInitializer

Entry point for configuring the SDK. Call once at app startup:

MiruSdkInitializer.initialize(
MiruSdkConfig(
networkConfig = NetworkConfig(
baseUrl = "https://api.yourapp.com/v1/",
enableLogging = BuildConfig.DEBUG
),
enableLogging = true,
tokenProvider = MyTokenProvider(),
additionalModules = listOf(
userModule,
productModule,
settingsModule
)
)
)

MiruSdkConfig

ParameterTypeDescription
networkConfigNetworkConfigHTTP client configuration
enableLoggingBooleanEnable Napier logging
tokenProviderTokenProvider?Auth token provider (optional)
additionalModulesList<Module>Your app's Koin modules

Koin Modules

The SDK internally registers these Koin modules:

ModuleProvides
coreModuleDispatcherProvider, Logger
networkModuleHttpClient, HttpClientFactory
platformModulePlatform-specific implementations

Your app modules are added alongside these via additionalModules.

Compose Injection

Use standard Koin Compose APIs:

// ViewModel injection
@Composable
fun UserScreen(viewModel: UserViewModel = koinViewModel()) {
// ...
}

// Regular dependency injection
@Composable
fun MyComponent() {
val repository: UserRepository = koinInject()
}

Organizing Koin Modules

Recommended pattern — one module per feature:

val userModule = module {
// Data layer
single { UserMapper() }
single { UserApi(get()) }
single<UserRepository> { UserRepositoryImpl(get(), get()) }

// Domain layer
factory { GetUsersUseCase(get()) }
factory { GetUserByIdUseCase(get()) }

// Presentation layer
viewModel { UserListViewModel(get()) }
viewModel { UserDetailViewModel(get()) }
}

Then pass all modules at initialization:

MiruSdkInitializer.initialize(
MiruSdkConfig(
// ...
additionalModules = listOf(
userModule,
productModule,
orderModule
)
)
)