dvpermyakov / dagger-kotlin

Pure Kotlin dependency injection library for educational purposes

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Dependency injector library for Kotlin

CircleCI Bintray License: MIT

This library is very similar to dagger-2 library, but it generates kotlin files (*.kt) instead of java files (*.java). It uses apt to generate components and factories.

You can create a component interface with modules and dependencies fileds (@Component.Factory is optional):

@Component(
    modules = [MainModule::class, DatabaseModule::class, RepositoryModule::class],
    dependencies = [DataDependencies::class]
)
interface MainComponent : ProfileDependencies, GlobalConfigDependencies {

    fun getSubcomponent(): MainSubcomponent

    fun getTransactionViewModel(): TransactionViewModel

    fun getSampleConfig(): GlobalConfig

    fun inject(view: TransactionView)

    @Component.Factory
    interface Factory {
        fun createNewInstance(
            @BindsInstance nConfig: NetworkConfig,
            dataDependencies: DataDependencies,
            @BindsInstance dConfig: DatabaseConfig,
            mainModule: MainModule
        ): MainComponent
    }
}

You can use a module with @Provide annotated methods:

@Module
class DatabaseModule {

    @Singleton
    @Provide
    fun getDatabase(): Database {
        return Database()
    }

}

Yuu can use a module with @Binds annotated methods:

@Module
interface RepositoryModule {

    @Binds
    fun provideSampleRepository(impl: CardRepositoryImpl): CardRepository

    @Binds
    fun provideTransactionRepository(impl: TransactionRepositoryImpl): TransactionRepository

}

You can create a subcomponent interface with a modules filed:

@Subcomponent(modules = [ParameterModule::class])
interface MainSubcomponent : ProfileDependencies {
    fun getTransactionViewModel(): TransactionViewModel

    fun getParameterConfig(): ParameterConfig
}

You can use @Inject in constructors:

class TransactionRepositoryImpl @Inject constructor(
    private val config: GlobalConfig,
    private val profile: ProfileModel
) : TransactionRepository {

    override fun getTransactions(card: CardModel): List<TransactionModel> {
        return if (config.transactionAvailable && profile.id.isNotBlank()) {
            when (card.id) {
                "1" -> {
                    listOf(
                        TransactionModel("1"),
                        TransactionModel("2")
                    )
                }
                "2" -> {
                    listOf(
                        TransactionModel("3"),
                        TransactionModel("4")
                    )
                }
                else -> emptyList()
            }
        } else emptyList()
    }

}

You can use @Inject in fileds:

class TransactionView {

    @Inject
    lateinit var transactionViewModel: TransactionViewModel

    @Inject
    lateinit var accountViewModel: AccountViewModel

}

Gradle:

repositories {
   maven {
        url  "https://dl.bintray.com/dvpermyakov/maven" 
    }
}
dependencies {
   implementation 'com.dvpermyakov:dagger-kotlin:0.0.2'
}

About

Pure Kotlin dependency injection library for educational purposes

License:MIT License


Languages

Language:Kotlin 100.0%