[JetPack] Koin
-
Koin : DI를 위한 라이브러리 (Dagger대체 가능)
-
프로젝트에 추가하기
// Project level
allprojects {
repositories {
jcenter()
}
}
// app level
dependencies {
// 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"
// Koin for Android
implementation "org.koin:koin-android:$koin_version"
// Koin Android Scope features
implementation "org.koin:koin-android-scope:$koin_version"
// Koin Android ViewModel features
implementation "org.koin:koin-android-viewmodel:$koin_version"
// Koin Android Experimental features
implementation "org.koin:koin-android-ext:$koin_version"
// Koin AndroidX Scope features
implementation "org.koin:koin-androidx-scope:$koin_version"
// Koin AndroidX ViewModel features
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
// Koin AndroidX Experimental features
implementation "org.koin:koin-androidx-ext:$koin_version"
}
- DSL을 이용해 모듈 생성하기
// Given some classes
class Controller(val service : BusinessService)
class BusinessService()
// just declare it
val myModule = module {
single { Controller(get()) }
single { BusinessService() }
}
- Koin의 DSL
- applicationContext : Koin모듈 생성
- factory : inject()할 때 마다 인스턴스를 생성함.
- single : 싱글톤 인스턴스를 생성함.
- bind : 종속시킬 class나 interface를 주입
- get : 서로서로 필요한 인스턴스들 끼리 주입해 줌
- Koin 시작하기
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
// (Opt)use AndroidLogger as Koin Logger - default Level.INFO
androidLogger()
// use the Android context given there
androidContext(this@MainApplication)
// (Opt)load properties from assets/koin.properties file
androidFileProperties()
// module list
modules(offlineWeatherApp)
}
}
}
- 주입받기
class MyActivity : AppCompatActivity(){
// Inject Controller
val controller : Controller by inject()
override fun onCreate() {
super.onCreate()
// or directly retrieve instance
val controller : Controller = get()
}
}
- Scope API 적용 : scope를 이용해 Activity나 Fragment의 라이프 사이클을 스코프로 사용할 수 있다.
- 스코프 적용
module {
// declare a scope for DetailActivity
scope(named<DetailActivity>)> {
scoped<DetailContract.Presenter> { DetailPresenter(get(), get()) }
}
}
- 스코프 적용된 컴포넌트 주입받기
class DetailActivity : AppCompatActivity(), DetailContract.View {
// inject from current activity scope instance
override val presenter: DetailContract.Presenter by currentScope.inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//...
}
}
- AAC의 ViewModel 사용하기 : Koin은 ViewModel을 위한 DSL을 제공한다. by viewModel/getViewModel()을 사용하여 inject한다. 여러 Fragment에서 공유하기 위한 by sharedViewModel/getSharedViewModel()도 있다.