Android - 使用 dagger2 将 repo 依赖项传递到多模块项目上的 ViewmodelFactory

问题描述 投票:0回答:1

我在一个干净的架构多模块项目上使用 Dagger2,这里有一个简化的概述来详细说明我的问题:

DataLayer -> SecondModule -> App

我有一个位于数据层的 repo-singleton,可以跨所有功能和应用程序模块访问。这是由 dagger 在我的 App 模块中提供的 -

@Module
class AppModule {

    @Provides
    fun provideStateSingleton(): com.example.data.StateSingletonImpl {
        return com.example.data.StateSingletonImpl()
    }

}

这个模块当然被提供给我的 AppComponent 来生成我的应用程序图 -

@Component(modules = [AppModule::class])
interface ApplicationComponent {

    fun inject(activity: OpeningActivity)

    fun inject(activity: SecondScreenActivity)

}

我将通过构造函数注入将这些 repo 依赖项传递到我的 Viewmodels 中,这意味着我将不得不使用 viewmodel-factory。问题是我正在阅读的文档建议我使用 MyApplication 的实例来这样做。

class ViewModelFactory(private val counter: Int) : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            return SecondScreenViewModel(userRepository = **(application as MyApplication).myRepository**) as T
        }
    }

我正在使用此资源创建 viewmodel-factory - https://developer.android.com/topic/libraries/architecture/viewmodel/viewmodel-factories#viewmodel-factories-old

本文档中的每个示例都涉及 MyApplication 以获取存储库,另一个示例 ->

private val viewModel: MyViewModel by viewModels {
    MyViewModel.provideFactory((application as MyApplication).myRepository, this)
}

但是有了干净的架构,我的其他功能模块不应该访问/依赖我的应用程序模块!当它所在的模块无法访问包含MyApplication的模块时,我应该如何调用上面的(应用程序作为MyApplication).myRepository

感谢您的任何意见,感谢任何帮助/链接/指向正确方向!

android kotlin dagger-2 android-viewmodel clean-architecture
1个回答
0
投票

我找到了这篇文章的解决方案 - https://proandroiddev.com/viewmodel-with-dagger2-architecture-components-2e06f06c9455

本质上,viewmodelFactory 和相关依赖项是通过 Dagger2 在后台提供的,符合 Google 的干净架构范式。

作为奖励,我将本指南用于 DI,因为这样做需要使用 Dagger Android 支持库 - https://medium.com/@shashankmohabia/dagger-android-with-mvvm-dependency-injection -for-android-3a7e33ad1013

© www.soinside.com 2019 - 2024. All rights reserved.