오늘도 더 나은 코드를 작성하였습니까?

Android Code Lab(Dagger2) 정리7 본문

DI/Dagger2

Android Code Lab(Dagger2) 정리7

hik14 2021. 12. 22. 20:23

@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