Skip to content

dvpermyakov/dagger-kotlin

Repository files navigation

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

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages