Как эффективно использовать Dagger 2 с MVVM и Clean Architecture для проекта с несколькими модулями Android - PullRequest
1 голос
/ 03 февраля 2020

У меня есть многомодульный проект, который следует принципам чистой архитектуры. У меня есть приложение, презентация, домен, данные и удаленные модули. Я также использую 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 и чистой архитектурой.

Буду признателен за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...