생성자 주입이 달라야 하는 이유
제공된 객체가 다른 객체의 생성자에 주입되어야 한다고 해보자.
class Student(val name: String)
class Teacher(val name: String, val teachingStudent: Student)
이럴 경우 Teacher은 Student를 주입받아야 한다. 이때 우리는 다음과 같이 get()을 이용해 제공된 객체를 주입받을 수 있다.
single { Student("student-kim") }
single { Teacher("teacher-cho", get()) }
get()의 역할
예제 링크 : https://github.com/seyoungcho2/KoinExample
예제 브랜치명 : example/example3 *브랜치 필수 확인
get()은 제공된 객체들 중 해당 부분에 들어갈 수 있는 객체를 찾아 넣는다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
startKoin {
androidContext(this@MainActivity)
modules(
module {
single { Student("student-kim") }
single { Teacher("teacher-cho", get()) }
}
)
}
val teacherCho: Teacher by inject()
findViewById<TextView>(R.id.textViewTeacher).text = teacherCho.name
findViewById<TextView>(R.id.textViewStudent).text = teacherCho.teachingStudent.name
}
}
따라서 위와 같은 코드가 실행될 경우 <그림1> 처럼 Teacher의 val teachingStudent : Student 프로퍼티에 Student("student-kim")이 get()에 의해 들어가게 된다.
get(named())
예제 링크 : https://github.com/seyoungcho2/KoinExample
예제 브랜치명 : example/example4 *브랜치 필수 확인
물론 get에도 named 프로퍼티가 들어가서 두 개 이상의 Student 가 있을 때 어떤 Student를 주입할지를 결정할 수 있게 된다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
startKoin {
androidContext(this@MainActivity)
modules(
module {
single(named("park")) { Student("student-park") }
single(named("kim")) { Student("student-kim") }
single { Teacher("teacher-cho", get(named("park"))) } // Student("student-park") 주입
}
)
}
val teacherCho: Teacher by inject()
findViewById<TextView>(R.id.textViewTeacher).text = teacherCho.name
findViewById<TextView>(R.id.textViewStudent).text = teacherCho.teachingStudent.name
}
}
위의 예제에서는 named("park")이 주입되어 textview에는 student-park이 나타나게 된다.
반응형