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개의 댓글