У меня есть файл JSON в папке с ресурсами, и классу DataManager (репозиторий) он нужен, поэтому у менеджера ресурсов (и контекста) должен быть доступ к ресурсам.
Проблема заключается в том, что, исходя из передовой практики, контекст Android или специфичный для Android код не должны передаваться на уровень данных (ViewModel-Repo-Model) из-за написания модульных тестов и т. д., а также представление не должно взаимодействовать с уровнем данных напрямую.
В итоге я предоставил список, используя и внедрив его в репозиторий.
Правильно ли это?
-Спасибо
PS: класс моего модуля, который предоставляет список
@Module
public class UtilModule {
@Provides
@JsonScope
JsonUtil provideJsonUtil(AssetManager assetManager){
return new JsonUtil(assetManager);
}
@Provides
@JsonScope
String provideJson(JsonUtil util){
return util.getJson();
}
@Provides
@JsonScope
Type provideType(){
return new TypeToken<List<Data>>() {}.getType();
}
@Provides
@JsonScope
DataManager provideDataManager (Gson gson, Type type,String json) {
return new DataManager (gson.fromJson(json, type));
}
}
Прямой доступ к контексту ViewModel не является нарушением MVVM для Repository и/или Application, и это все, что вам нужно для доступа к AssetsManager. Вызов Application.getAssets() допустим, поскольку ViewModel не использует какой-либо конкретный контекст Activity.
Например, вы можете использовать предоставленный Google подкласс AndroidViewModel вместо суперкласса ViewModel. AndroidViewModel принимает Application в своем конструкторе (ViewModelProviders внедрит его за вас). Вы можете передать свой Application своему Repository в его конструкторе.
В качестве альтернативы вы можете использовать внедрение зависимостей Кинжал для внедрения Application непосредственно в ваш Repository. (Вставка контекста Application немного сложна. См. Dagger 2 внедряет контекст Android и эта проблема зарегистрирована в репозитории Danger github.) Если вы хотите сделать это действительно гладким, вы можете настроить поставщика для AssetManager и внедрить его непосредственно в ваш Repository.
Наконец, если вы используете Room и все, что вам нужно, это предварительно заполнить базу данных Room предварительно настроенной базой данных, хранящейся в активах, вы можете следовать инструкциям здесь: Как использовать библиотеку Room Persistence Library с предварительно заполненной базой данных?