我正在使用MVP构建应用程序,而我正在使用存储库模式。
我有一个本地数据源,这是一个存储某些信息的数据库。
我有一个远程数据源,在其中使用Retrofit,我发出了API请求。此请求具有@Query
,这是存储在SharedPreferences中的String。
我想将SharedPreferences作为数据源添加到存储库,但由于远程数据源应该使用这些SharedPreferences - 这将是与远程数据源不同的数据源 - 我不再认为这种体系结构如此清晰。
非常感谢您的帮助。
答案 0 :(得分:9)
我认为很多人过度复杂了存储库的概念。存储库模式实际上只是Facade模式的一种特定类型。它只是一个位于真实数据源(模型)和消费者之间的抽象层。
我们说我们有一个处理天气数据的系统。在这种情况下,我发现有三个Modal类没有错:
WeatherHttp
WeatherDb
WeatherPrefs
这些都可以是通过构造函数注入的存储库类的成员。所有这三个都隐藏在单个存储库类后面的使用者(UI)中:
WeatherRepository
可能只有一个公共方法:
public void getWeatherForecasts(Callback<List<Forecast> forecastCallback);
或Rx:
public Observable<List<Forecast>> getWeatherForecasts();
在该方法的幕后,您可能会进行http调用以获取最新数据,数据库调用以保存大部分详细信息,并使用共享prefs编辑来保存上次获取数据的时间戳。这个想法是你可以随时改变实施方式,消费者也不在乎。
实施存储库最重要的一点是您不得泄漏实施细节。存储库的公共API不应公开网络类,数据库DAO或SharedPreference密钥。