티스토리 뷰

09. 한정자 지정하기

  • 반환형으로 바인드된 객체를 식별하기 애매할 때
  • example: string 타입 2개를 반환 하는 경우
@Module
class MyModuleEx{
    @Provides
    fun provideHello() = "Hello"
    fun provideWorld() = "World"
}
  • string 형식 반환이 2개 있으므로 오류!
  • 그러나 2개가 필요한 상황이 있을 수 있다.
  • 이럴때는 javax.inject package 에서 @Named 어노테이션을 사용할 수 있다.
import dagger.Component
import dagger.Module
import dagger.Provides
import javax.inject.Inject
import javax.inject.Named
@Component(modules = [MyModuleNamed::class])
interface MyComponentNamed {
    fun inject(myClassNamed: MyClassNamed)
}
@Module
class MyModuleNamed {
    @Provides
    @Named("hello")
    fun provideHello() = "Hello"

    @Provides
    @Named("world")
    fun provideWorld() = "World"
}
class MyClassNamed {
    @Inject
    @Named("hello")
    lateinit var strHello: String

    @Inject
    @Named("world")
    lateinit var strWorld: String
}
  • Test
    @Test
    fun test_namedComponent(){
        val myClassNamed = MyClassNamed()
        val component = DaggerMyComponentNamed.create()
        component.inject(myClassNamed)
        println(myClassNamed.strHello + myClassNamed.strWorld) // HelloWorld
    }

사용자 정의 한정자 만들기

  • @Named가 아닌 고유의 한정자를 만들려면 @Qualifier
@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class Hello {
}
@Component(modules = [MyModuleNamed::class])
interface MyComponentNamed {
    fun inject(myClassNamed: MyClassNamed)
}
@Module
class MyModuleNamed {
    @Provides
    @Hello // here 
    fun provideHello() = "Hello"

    @Provides
    fun provideWorld() = "World"
}
class MyClassNamed {
    @Inject
    @Hello // here
    lateinit var strHello: String

    @Inject
    lateinit var strWorld: String
}
  • test
    @Test
    fun test_namedComponent(){
        val myClassNamed = MyClassNamed()
        val component = DaggerMyComponentNamed.create()
        component.inject(myClassNamed)
        println(myClassNamed.strHello + myClassNamed.strWorld) // HelloWorld
    }
  • 잘 출력되는 것을 알 수 있다.

2021.07.23 - [Android/클린 아키텍처] - [Clean Architecture] 09-Lazy 주입 & Provider 주입 (dagger)

2021.07.22 - [Android/클린 아키텍처] - [Clean Architecture] 08-Dagger2의 컴포넌트(Component)

2021.07.21 - [Android/클린 아키텍처] - [Clean Architecture] 07-Dagger2의 모듈(Module)

해당 글은 '아키텍처를 알아야 앱 개발이 보인다' 를 공부하며 요약 정리한 글 입니다.
댓글
최근에 올라온 글
최근에 달린 댓글
네이버 이웃추가
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함