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

Android Code Lab(Dagger2) 정리5 본문

DI/Dagger2

Android Code Lab(Dagger2) 정리5

hik14 2021. 12. 22. 15:04

객체의 Scope를 다른 LifeCycle로 지정하는 것 외에도 Subcomponent를 만드는 것은 애플리케이션의 서로 다른 부분을 캡슐화하는 좋은 방법이다.

 

앱의 Flow에 따라 다른 Dagger Sub Graph를 생성하여 앱을 구조화를 하면 Memory 및 App Start Time면에서 보다 성능이 좋고 확장 가능한 응용 프로그램을 만드는 데 도움이 됩니다. 

 

Dagger Component 를 읽고 모듈화하기 어렵게 만들 수 있으므로  App의 모든 객체를 제공하는 모놀리식(1개의 Component만 사용) Component를 만들면안된다.

 

LoginComponent 생성하기.

 

 LoginActivity와 동일한 수명을 가지므로 ActivityScope로 LoginComponent에 주석을 추가.

 

LoginComponent.kt

@ActivityScope
@Subcomponent
interface LoginComponent {

    @Subcomponent.Factory
    interface Factory {
        fun create(): LoginComponent
    }

    fun inject(activity: LoginActivity)
}

 

LoginViewModel.kt

class LoginViewModel @Inject constructor(private val userManager: UserManager) {
    ...
}

LoginViewModel은 다른 클래스에서 재사용할 필요가 없으므로 @ActivityScope로 주석을 달지 않아야 된다.

 

 

AppSubcomponent.kt

@Module(subcomponents = [RegistrationComponent::class, LoginComponent::class])
class AppSubcomponents

AppSubcomponents 모듈에 있는 AppComponent의  Subcomponent 목록에 새 하위 LoginComponent를 추가해야 합니다.

 

AppComponent.kt

@Singleton
@Component(modules = [StorageModule::class, AppSubcomponents::class])
interface AppComponent {
    ...
    // Types that can be retrieved from the graph
    fun registrationComponent(): RegistrationComponent.Factory
    fun loginComponent(): LoginComponent.Factory

    // Classes that can be injected by this Component
    fun inject(activity: MainActivity)
}

LoginActivity가 LoginComponent 팩토리에 액세스할 수 있으려면 AppComponent 인터페이스에서 이를 노출해야 합니다.

 

LoginActivtiy.kt

class LoginActivity : AppCompatActivity() {

    lateinit var loginViewModel: LoginViewModel

    ...

    override fun onCreate(savedInstanceState: Bundle?) {
    
        (application as MyApplication).appComponent.loginComponent().create().inject(this)

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)


        ...
    }
}

현재 Application Graph 

 

'DI > Dagger2' 카테고리의 다른 글

Android Code Lab(Dagger2) 정리7  (0) 2021.12.22
Android Code Lab(Dagger2) 정리6  (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