Android/Dependency Injection

[Koin] 4. get()을 이용하여 생성자에 주입하기

반응형

생성자 주입이 달라야 하는 이유

제공된 객체가 다른 객체의 생성자에 주입되어야 한다고 해보자.

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()에 의해 들어가게 된다.

 

그림1. 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이 나타나게 된다.

그림2. get(named)를 이용한 주입

 

그림3. 예제 실행 화면

반응형

 

이 글의 저작권은 Kotlin World 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.