Dagger2를 알아보자 – 기본편
Dagger2를 알아보자 – Scope 
Dagger2를 알아보자 – Injection의 종류 
Dagger2를 알아보자 – Qualifier 
Dagger2를 알아보자 – Binding 
Dagger2를 알아보자 – Multibinding 
Dagger2를 알아보자 – SubComponent 
Dagger2를 알아보자 – Android
Dagger2를 알아보자 – Testing(준비중)
Dagger2를 알아보자 – Dynamic Feature에 적용하기(You’re here)

Dynamic Feature Module에 Dagger 적용하기

위의 그림을 보면 일반적인 라이브러리 모듈과 달리 DFM(Dynamic Feature Module)은 app모듈(base모듈)과 의 의존관계가 역전된다. 

app모듈에서 일반적인 라이브러리 모듈을 의존하는 경우 컴파일 타임에 해당 모듈을 참조할 수 있기 때문에 문제가 되지 않는다. 하지만 app모듈에서 DFM을 의존하는 경우 app모듈의 어노테이션 프로세서가 DFM 어노테이션정보를 가져 올 수 없으므로 @ContributeAndroidInjector 사용 및 서브 컴포넌트 구성이 어려워 진다.

그래서 DFM에서 app모듈에 있는 컴포넌트를 확장하는 방법으로 문제를 해결할 수 있다.

@Component의 멤버로 dependencies 항목이 있는데 이를 사용하면 특정 컴포넌트를 상속하는 방식으로 오브젝트 그래프를 확장할 수 있다.

@FeatureScope
@Component(
    dependencies = [ApplicationComponent::class],
    modules =[
        AndroidSupportInjectionModule::class,
        FeatureModule::class
    ]
)
interface FeatureComponent:AndroidInjector<FeatureActivity>{
    @Component.Factory
    abstract class Factory{
        abstract fun create(
            @BindsInstance activity: FeatureActivity,
            component: ApplicationComponent): AndroidInjector<FeatureActivity>
    }
}
class FeatureActivity: DaggerAppCompatActivity(){

    @Inject
    @JvmField
    @Volatile
    var androidInjector: DispatchingAndroidInjector<Any>? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        injectIfNecessary()
        super.onCreate(savedInstanceState)
        //…
    }

    private fun injectIfNecessary() {
        if (androidInjector == null) {
            synchronized(this) {
                if (androidInjector == null) {
                    DaggerFeatureComponent.factory()
                        .create(this, MyApplication.applicationComponent())
                        .inject(this)
                    checkNotNull(androidInjector) {…}
                }
            }
        }
    }

    override fun androidInjector(): AndroidInjector<Any?>? {
        injectIfNecessary()
        return androidInjector
    }

}

주의해야 할 점은 AndroidInjector로 인젝션 하는 대신 확장한 컴포넌트 객체로 멤버-인젝션을 해줘야 한다는 점이다. 

카테고리: Dagger2

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.