我在一个干净的架构多模块项目上使用 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?
感谢您的任何意见,感谢任何帮助/链接/指向正确方向!
我找到了这篇文章的解决方案 - 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