일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ㅓ
- Functional Programming
- factory method
- 디자인패턴 #
- 함수형프로그래밍
- 코틀린
- 팩토리 메소드
- 추상팩토리패턴
- Abstract Factory
- 옵저버 패턴
- PrototypePattern
- 싱글톤
- El
- Observer Pattern
- F
- 추상 팩토리
- ㅋㅁ
- designPattern
- Design Pattern
- Kotlin
- r
- 빌터패턴
- a
- 디자인패턴
- builderPattern
- 프로토타입 패턴
- Singleton
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
Android Code Lab(Dagger2) 정리7 본문
@Provides
@Inject 및 @Binds 주석 외에도 @Provides를 사용하여 Dagger에 Dagger 모듈 내부의 클래스 인스턴스를 제공하는 방법을 알릴 수 있습니다.
@Provides
- 함수의 반환 유형(호출 방법은 중요하지 않음)은 Dagger에게 그래프에 추가되는 유형을 알려줌.
- 함수의 매개변수는 Dagger가 해당 유형의 인스턴스를 제공하기 전에 충족해야 하는 종속성
@Module
class StorageModule {
// @Provides tell Dagger how to create instances of the type that this function
// returns (i.e. Storage).
// Function parameters are the dependencies of this type (i.e. Context).
@Provides
fun provideStorage(context: Context): Storage {
// Whenever Dagger needs to provide an instance of type Storage,
// this code (the one inside the @Provides method) will be run.
return SharedPreferencesStorage(context)
}
}
그럼 @Provides 와 @Bind 언제 써야될까?
- 인터페이스 구현(@Binds는 코드를 덜 생성하므로 더 효율적이기 때문에 권장되지만)
- 프로젝트가 소유하지 않은 클래스(예: Retrofit의 인스턴스) 외부 라이브러리의 Builder를 통해 객체를 주입할때는 provides가 권장
Qualifiers
qualifier는 동일한 type의 다른 구현을 Dagger 그래프에 추가하려는 경우에 유용합니다.
Storage 개체가 제공되기를 원했다면 한정자를 사용하여 구별할 수 있다.
qualifier는 종속성을 식별하는 데 사용되는 사용자 지정 주석입니다.
StorageModule의 @Provides를 사용하여 다양한 구현을 추가할 수 있습니다. qualifier를 사용하여 구현의 종류를 식별할 수 있습니다.
@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class RegistrationStorage
@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class LoginStorage
@Module
class StorageModule {
@RegistrationStorage
@Provides
fun provideRegistrationStorage(context: Context): Storage {
return SharedPreferencesStorage("registration", context)
}
@LoginStorage
@Provides
fun provideLoginStorage(context: Context): Storage {
return SharedPreferencesStorage("login", context)
}
}
// In a method
class ClassDependingOnStorage(@RegistrationStorage private val storage: Storage) { ... }
// As an injected field
class ClassDependingOnStorage {
@Inject
@field:RegistrationStorage lateinit var storage: Storage
}
@Provides 메서드에 주석을 추가하는 데 사용할 수 있는 RegistrationStorage 및 LoginStorage.
Graph에 두 가지 유형의 Storage(RegistrationStorage 및 LoginStorage)를 추가하고 있습니다.
두 메서드 모두 Storage를 반환하고 매개변수(종속성)는 동일하지만 이름이 다릅니다.
@Provides 함수의 name에는 기능이 없으므로 다음과 같이 qualifier를 사용하여 그래프에서 이름을 검색해야 합니다.
@Name 주석의로 qualifier와 동일한 역활을 할수는 있지만 qualifier를 쓰는것이 권장된다.
- Proguard 또는 R8에서 제거할 수 있습니다.
- 이름 일치를 위해 공유 상수를 유지할 필요가 없습니다.
- 문서화할 수 있습니다
'DI > Dagger2' 카테고리의 다른 글
Android Code Lab(Dagger2) 정리6 (0) | 2021.12.22 |
---|---|
Android Code Lab(Dagger2) 정리5 (0) | 2021.12.22 |
Android Code Lab(Dagger2) 정리4 (0) | 2021.12.21 |
Android Code Lab(Dagger2) 정리3 (0) | 2021.12.21 |
Android Code Lab(Dagger2) 정리2 (0) | 2021.12.21 |