SessionData.kt
class SessionData{
val sessionId : String
constructor() {
this.sessionId = "abcd"
}
}
ExampleData.kt
class ExampleData{
var value : Int = 0
val sessionData : SessionData
init{
sessionData = SessionData()
}
}
아주 간단하게 DI의 개념에 대해서 이야기 하였고 이젠 koin을 알아보자.
DSL(Domain Specific Language)로 번역을 하자면 도메인 특화 언어로 위키 피디아에서는 "특정한 도메인을 적용하는데 특화된 언어"라고 한다.
이런식으로 모듈을 만들어서 주입을 해준다면.
var repositoryModule = module{
single{SampleRepoImpl(get())}
}
class SampleRepoImpl(private val sampleRemoteDataSource : SampleRemoteDataSource) : SampleRepo{
}
val vm : SampleViewModel by inject()
위처럼 사용하여 주입받아서 뷰모델도 쓸 수 있다.
factory{
ExampleData()
}
val data by inject<ExampleData>()
inject로 생성자 없이 주입받아 사용할 수 있다.
예를 들면, ViewModel..?
Class TvViewModel : ViewModel () {
KoinComponent {
private val _tvLiveData: MutableLiveData<TvInfoResult> = MutableLiveData() //PrintService를 생성자 없이 inject로 주입힌다.
val tvRepoImpl: TvRepoImpl by inject()
val tvData: LiveData<TvInfoResult>
get() = _tvLiveData
fun requestData() {
tvRepoImpl.getPopularTv(apikey, language, page)
.subscribe()………{
result.foreach{ it ->
tvData = it
}
_tvLiveData.value = tvData //받아온 데이터 LiveData로 포장
}
}
위와 같은 형태로 사용할 수 있다. (그냥 ViewModel()옆에 KoinComponent로 implementation해도 된다.
class SampleViewModel(private val repo : SampleRepoImpl) : BaseViewModel(){}
요렇게.