我有一个遵循Clean Architecture原理的多模块项目。我有应用程序,演示文稿,域,数据和远程模块。我也在使用Android Architecture Components,并在表示层中应用MVVM。
一个简单的ViewModel
类看起来像这样
class SignUpViewModel @Inject internal constructor(
private val signUpInfoMapper: Mapper<SignUpInfo, SignUpInfoEntity>,
private val signUpTask: SignUpTask
) : ViewModel() {
// LiveData and methods
}
每个ViewModel
都依赖于域模块和一个或多个映射器中的任务(用例)。每个用例都依赖于数据模块中的存储库类。每个存储库类都依赖于远程模块中的API。因此,存在依赖链。
我正在按如下方式注入ViewModel,并且ViewModelModule
属于Singleton
AppCpmponent
。
@Module
abstract class ViewModelModule {
@Binds
internal abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(SignUpViewModel::class)
internal abstract fun signUpViewModel(viewModel: SignUpViewModel): ViewModel
}
@Target(
AnnotationTarget.FUNCTION,
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER
)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@MapKey
internal annotation class ViewModelKey(val value: KClass<out ViewModel>)
此刻,每个ViewModel
依赖项和子依赖项都用Singleton
范围注释。它可以工作,但是随着项目的发展以及应用程序整个生命周期中将要使用的单例类的数量增加,将所有这些类都注释为Singleton
可能不是一个好主意。因此,我认为为每个功能使用不同的Dagger 2组件以及具有不同作用域的必要模块可以解决该问题,但是ViewModels不能使用功能范围进行注释。
我想知道在带有MVVM和Clean Architecture的多模块项目中通过Dagger 2应用依赖注入的最佳实践是什么。
任何帮助将不胜感激。
请参阅Google的Android开发人员指南的this文档。