У меня есть многомодульный проект, который следует принципам чистой архитектуры. У меня есть приложение, презентация, домен, данные и удаленные модули. Я также использую Android Компоненты архитектуры и применяю MVVM на уровне представления.
Простой класс ViewModel
выглядит следующим образом
class SignUpViewModel @Inject internal constructor(
private val signUpInfoMapper: Mapper<SignUpInfo, SignUpInfoEntity>,
private val signUpTask: SignUpTask
) : ViewModel() {
// LiveData and methods
}
Каждый ViewModel
зависит от задача (вариант использования) из модуля домена и один или несколько картографических. Каждый сценарий использования зависит от класса репозитория из модуля данных. Каждый класс репозитория зависит от API удаленного модуля. Итак, есть цепочки зависимостей.
Я внедряю ViewModels, как показано ниже, и 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
scope. Это работает, но аннотирование всех этих классов как Singleton
может быть не очень хорошей идеей, так как проект растет, и число одноэлементных классов, которые будут жить в течение всего жизненного цикла приложения, увеличивается. Поэтому я подумал, что наличие отдельного компонента Dagger 2 для каждой функции и необходимых модулей с разной областью действия решит проблему, но ViewModels нельзя аннотировать областями функций.
Интересно, что лучше всего применять? внедрение зависимостей через Dagger 2 в многомодульный проект с MVVM и чистой архитектурой.
Буду признателен за любую помощь.