Является ли хорошей идеей передать репозиторий параметров в ViewModel вместо того, чтобы наследоваться от AndroidViewModel? - PullRequest
1 голос
/ 09 апреля 2020

Код A от https://github.com/android/architecture-components-samples/tree/master/PagingWithNetworkSample

Код B от https://github.com/android/architecture-components-samples/tree/master/PagingSample

Я знаю, что должен использовать AndroidViewModel вместо ViewModel, когда мне нужно использовать Context для создания экземпляра Room на основе базы данных, как код B.

Я считаю, что класс SubRedditViewModel в коде A не унаследован от AndroidViewModel , он передает параметр repository с помощью функции построения.

Хорошая ли идея передать параметр repository в ViewModel вместо унаследованного от AndroidViewModel?

Код A

class SubRedditViewModel(
        private val repository: RedditPostRepository,
        private val savedStateHandle: SavedStateHandle
) : ViewModel() {
   ...
}

Код B

class CheeseViewModel(app: Application) : AndroidViewModel(app) {
    val dao = CheeseDb.get(app).cheeseDao()
    ...
}

1 Ответ

3 голосов
/ 11 апреля 2020

В тот момент, когда вы наследуете AndroidViewModel, ваш класс становится менее тестируемым, поскольку вы зависите от Android фреймворка. Кроме того, в своем фрагменте кода B вы утратили возможность вставлять двойной тест для вашего dao, что делает тестирование еще сложнее.

В заключение постарайтесь избегать использования рамочных классов и практикуйте внедрение зависимостей (вручную или с помощью DI-фреймворка, такого как Dagger, это не имеет значения). Так что ваш фрагмент кода А предпочтительнее.

...