[Android] Dagger Hilt Assisted Inject - 런타임 주입

이승우·2023년 6월 11일
2

AssistedInject에 대해서 알아보려고 한다.

AssistedInject

기존 Hilt를 사용했을 때는 미리 명시된 의존 Graph에서 명시적으로 정의된 Module만을 주입받을 수 있었다. 하지만, AssistedInject를 통해서 런타임에 주입이 가능하다.

class HomeViewModel @AssistedInject constructor(
    @Assisted initialState: HomeState,
    private val getHomeDataUseCase: GetHomeDataUseCase,
    private val modelMapper: ModelMapper,
    private val networkHelper: NetworkHelper
) : MavericksViewModel<HomeState>(initialState) {
	
    @AssistedFactory
    interface Factory : AssistedViewModelFactory<HomeViewModel, HomeState> {
        override fun create(state: HomeState): HomeViewModel
    }

    companion object : MavericksViewModelFactory<HomeViewModel, HomeState> by hiltMavericksViewModelFactory()
}
  1. @AssistedFactory 어노테이션을 통해 Factory 인터페이스를 정의해주고, 그 안에서 parameter로 동적으로 전달할 객체를 명시해준다. (여기서는 HomeState 객체이다.)
@Module
@InstallIn(MavericksViewModelComponent::class)
interface ViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(HomeViewModel::class)
    fun homeViewModelFactory(factory: HomeViewModel.Factory): AssistedViewModelFactory<*, *>
}
  1. 1번에서 정의한 Factory를 parameter로 전달하고 Mavericks에서 사용할 AssistedViewModelFactory로 bind 시켜주도록 정의한다.
  2. Mavericsk에서는 이제 companion object로 정의된 클래스를 이용하여 자체적으로 의존성을 주입하게 된다.

AssistedInject 기능을 사용하려면 @HiltViewModel을 사용하면 안되며, @Inject 어노테이션이 아닌 @AssistedInject 어노테이션을 Constructor에서 사용해야 한다.

그리고 기존 Graph Module이 아니라 AssistedFactory를 통해 객체를 주입받는다는 것을 명시하기 위해 AssistedFactory를 통해 주입받는 객체에 @Assisted 어노테이션을 추가해준다.

이렇게 함으로써 getHomeDataUseCase, modelMapper, networkHelper는 미리 정의한 Graph의 모듈을 통해 주입받으며, @Assisted 어노테이션이 달린 initialState는 AssistedFactory를 통해 주입받는다.

이렇게 함으로써 Hilt는 ViewModel에게 특정 Object를 동적으로 주입해줄 수 있게 된다.

따라서 동적으로 ViewModel에게 객체를 주입할 상황이 생긴다면 AssistedInject를 활용해보자.

Ref

profile
Android Developer

0개의 댓글