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로 인젝션 하는 대신 확장한 컴포넌트 객체로 멤버-인젝션을 해줘야 한다는 점이다.
0개의 댓글