KOIN - a pragmatic lightweight dependency injection framework for Kotlin
Clone or download
Latest commit 755e88b Sep 30, 2018

README.md

logo

What is KOIN?

Kotlin Kotlin Backers on Open Collective Sponsors on Open Collective

A pragmatic lightweight dependency injection framework for Kotlin developers.

Written in pure Kotlin, using functional resolution only: no proxy, no code generation, no reflection.

Koin is a DSL, a light container and a pragmatic API

Official Website 👉 https://insert-koin.io

Check the getting started section from our website, to discover Koin with the favorite platform.

Contact & Latest News 🌐

Getting Help 🚒

Any question about Koin usage?

Reporting issues 🛠

Found a bug or a problem on a specific feature? Open an issue on Github issues

Setup

Current Version

koin_version = '1.0.1'

Gradle

Jcenter

Check that you have the jcenter repository.

// Add Jcenter to your repositories if needed
repositories {
	jcenter()    
}

Dependencies

Choose your Koin dependency:

Core features

// Koin for Kotlin
implementation "org.koin:koin-core:$koin_version"
// Koin extended & experimental features
implementation "org.koin:koin-core-ext:$koin_version"
// Koin for Unit tests
testImplementation "org.koin:koin-test:$koin_version"
// Koin for Java developers
implementation "org.koin:koin-java:$koin_version"

Android

// Koin for Android
implementation "org.koin:koin-android:$koin_version"
// Koin Android Scope feature
implementation "org.koin:koin-android-scope:$koin_version"
// Koin Android ViewModel feature
implementation "org.koin:koin-android-viewmodel:$koin_version"

AndroidX

// AndroidX (based on koin-android)
// Koin AndroidX Scope feature
implementation "org.koin:koin-androidx-scope:$koin_version"
// Koin AndroidX ViewModel feature
implementation "org.koin:koin-androidx-viewmodel:$koin_version"

SparkJava

// Koin for Spark Kotlin
implementation "org.koin:koin-spark:$koin_version"

Ktor

// Koin for Ktor Kotlin
implementation "org.koin:koin-ktor:$koin_version"

Quickstart

Declare a Koin module

Write with the Koin DSL what you need to assemble:

// Given some classes 
class Controller(val service : BusinessService) 
class BusinessService() 

// just declare it 
val myModule = module { 
  single { Controller(get()) } 
  single { BusinessService() } 
} 

Start Koin

Use the startKoin() function to start Koin in your application.

In a Kotlin app:

fun main(vararg args : String) { 
  // start Koin!
  startKoin(listOf(myModule))
} 

In an Android app:

class MyApplication : Application() {
  override fun onCreate(){
    super.onCreate()
    // start Koin!
    startKoin(this, listOf(myModule))
  } 
} 

Inject in Android

Easy to inject into your Android classes:

// Just inject in a simple Activity 
class MyActivity() : AppCompatActivity() {

    // lazy inject BusinessService into property
    val service : BusinessService by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // or directly get any instance
        val service : BusinessService = get()
    }
}

Inject by constructor

You're now ready! The Koin DSL help you make injection by constructors. Now just use it:

// Controller & BusinessService are declared in a module
class Controller(val service : BusinessService){ 
  
  fun hello() {
     // service is ready to use
     service.sayHello()
  }
} 

Koin can be easily embedded with your favorite Java/Kotlin SDK, and already provide some dedicated support module.

Ready for ViewModel

Want to use Android Architecture ViewModel? No problem, it's already available and easy to use:

// Injected by constructor
class MyViewModel(val repo : MyRepository) : ViewModel(){
}
// declare ViewModel using the viewModel keyword
val myModule : Module = module {
  viewModel { MyViewModel(get()) }
  single { MyRepository() }
}
// Just get it
class MyActivity() : AppCompatActivity() {

  // lazy inject MyViewModel
  val vm : MyViewModel by viewModel()
}

Easy testing

Use koin from a simple JUnit class:

// Just tag your class with KoinTest to unlick your testing power
class SimpleTest : KoinTest { 
  
  // lazy inject BusinessService into property
  val service : BusinessService by inject()

  @Test
  fun myTest() {
      // You can start your Koin configuration
      startKoin(myModules)

      // or directly get any instance
      val service : BusinessService = get()

      // Don't forget to close it at the end
      closeKoin()
  }
} 

And more: check your configuration with a simple unit test, easily create mocks...

Articles

Articles & resouces about Koin

Talks & podcasts

Koin developers hub

Contributors

This project exists thanks to all the people who contribute. [Contribute].

Backers

Thank you to all our backers! 🙏 [Become a backer]

Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]