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)
해당 글은 '아키텍처를 알아야 앱 개발이 보인다' 를 공부하며 요약 정리한 글 입니다.
'Android > 클린 아키텍처' 카테고리의 다른 글
[Clean Architecture] 12-바인딩의 종류 (Dagger) (0) | 2021.07.26 |
---|---|
[Clean Architecture] 11-범위 지정하기 (@Scope) (0) | 2021.07.25 |
[Clean Architecture] 09-Lazy 주입 & Provider 주입 (dagger) (0) | 2021.07.23 |
[Clean Architecture] 08-Dagger2의 컴포넌트(Component) (0) | 2021.07.22 |
[Clean Architecture] 07-Dagger2의 모듈(Module) (0) | 2021.07.21 |