我有三个数据源:
- 一个 JSON API
- Github
- XML 清单
我正在使用 Retrofit 和 OkHttp 等来访问所有这些:
- JSON API 使用 Gson 反序列化
- XML Manifest 返回一个字符串,我将对其进行反序列化
- Github 返回一个我显示的字符串
JSON 和 XML 将使用相同的实体进行反序列化。因此,我想将我的 MVP 代码编写得足够抽象,以至于它只需要实体。
所以,我为此写了一个接口
public interface BaseRomRepository {
// Addons
Call<List<AddonEntity>> getAddons(String slug);
Call<List<AddonEntity>> getAddons(int id);
Call<AddonEntity> getAddon(String slug);
Call<AddonEntity> getAddon(int id);
// Versions
Call<List<VersionEntity>> getVersions(String slug);
Call<List<VersionEntity>> getVersions(int id);
Call<VersionEntity> getVersion(String slug);
Call<VersionEntity> getVersion(int id);
}
所以,我的 Presenters 和 Interactors 可以简单地调用这些方法,它应该取决于实际使用 Repository 的实现。
然而,这就是我卡住的地方。我不确定使用 Dagger 2 执行此操作的最佳方法。我确信它适用于此用例,但我正在努力弄清楚在哪里/如何执行此操作。
我说得对吗?存储库和反序列化轻松地存在于 MVP 模型中。所有这些都应该发生在那里,Presenter 层可能相对不知道正在使用哪个存储库?
我会展示更多代码,但它非常混乱,我现在很难抽象成一种更易读的方式。
编辑:
这是一个 Gist,其中包含我到目前为止的一些实现:https ://gist.github.com/MatthewBooth/e3dd7a1f3a19fa0fd18e811752170be6