【问题标题】:MVVM with Android Architecture Components带有 Android 架构组件的 MVVM
【发布时间】:2017-07-05 14:09:27
【问题描述】:

我正在探索新的 Android 架构组件并希望将其实现到 Android 应用中。当我使用 iOS 开发的范例时,我对 MVVM 非常熟悉。阅读了由 Google 提供的 Android 架构组件指南:https://developer.android.com/topic/libraries/architecture/guide.html

我只有几个问题......

在上述指南中,Google 使用访问这些 Web 服务 API 的 UserRepository 类 - 他们继续将此类设为 Singleton 可能没问题,如果应用程序上只有一个屏幕来自 REST API 的所需数据。

我关心的是这个;谷歌似乎提倡需要在每个 ViewModel 的基础上创建一个存储库类。这对我来说听起来很错误,因为应用程序中有这么多 Singlton 类。如果我们有 10 个屏幕,有 10 个 ViewModel——每个都需要自己的Repository module——那么我们的应用程序中有十个单例。从 iOS 开发人员的角度来看,拥有这么多是错误的。

对此的解决方案是拥有一个具有公共方法的中介(存储库)类,公开 API 以从 REST API 获取数据。 Web 服务部分将在其自己的类中。这样,我们就可以很好地分离关注点。

最佳实践是每个 ViewModel 拥有一个存储库类 - 还是每个应用拥有一个?我对此不是 100% 确定的。

最后,当谈到Room时,我也有同样的担忧——Google 是说我们基于每个 ViewModel 创建一个数据库还是每个应用程序只创建一个数据库?

【问题讨论】:

  • 您真的在一个简单的页面中阅读了太多内容和一个简单的示例。他们设置的架构适用于某些应用程序,但不适用于其他应用程序。自己多想想什么是有意义的,少复制粘贴指南。
  • 本意不是复制粘贴。但我明白你的意思。谢谢。

标签: android mvvm android-room android-architecture-components


【解决方案1】:

我不认为架构指南建议为每个 ViewModel 创建一个单独的存储库类。在显示的示例中,Google 使用名为 Dagger 的库将单例存储库类注入 ViewModel。在功能上拆分存储库(或管理器)通常是最佳实践。例如,UserRepository 负责所有与用户相关的 api 调用。

如果您将此存储库转换为可以注入任何 ViewModel 的单例,则任何 ViewModel 现在都可以访问该特定存储库。

在快速查看房间后,我发现了这个小 sn-p (link):

注意:在实例化 AppDatabase 对象时,您应该遵循单例设计模式,因为每个 RoomDatabase 实例都相当昂贵,而且您很少需要访问多个实例。

对我来说,这意味着您可以像使用存储库类一样实现 RoomDatabase。只需将它们作为单例注入到您的 ViewModel 中,这样您就不需要拥有同一数据库的多个实例。

【讨论】:

  • 感谢您的信息;这确实有道理。从那里继续,假设我们在应用程序中有许多不同的 REST API - 没有两个,提供相同类型的数据。那么最好按功能对这些 API 进行分组并将它们放入相关的存储库中吗?我想,Room DB 也是如此。假设应用程序访问天气 API 和最新的 Motorsports API - 不相关的数据 - 所以他们需要单独的 ViewModel。在这种情况下,我们是否需要两个 Room DB 和两个休息区?
  • @Tander 对于第一个场景,两个不同的 REST API,您可能会查看数据而不是您与之交谈的实际端点。你有点希望 ViewModel 不知道数据的来源,ViewModel 想要做的就是说; weatherRepo.getWeather() 或类似的东西。如果你有一个不同的数据源从不同的端点获取相关数据,我会把它放在同一个 repo 中。如果是不同的数据,我会把它放在不同的仓库中。这与数据类型无关。
  • @Tander 第二种情况不太现实,拥有两个完全独立的本地数据库有什么意义?我会将它们全部合并到同一个房间数据库中(当然要使用正确的关系设置)
  • 关于不看终点的点,更何况,数据类型真的很清楚,谢谢。你是对的,ViewModel 不应该知道,也不在乎它获得的数据是来自 REST API 还是来自数据缓存,所以这里的 repo 是完美的。至于第二个用例;我同意拥有多个数据库似乎毫无意义。我们宁愿有一个单例 Room DB,它可以保存有关朋友列表和当前天气的数据(两种不相关的数据类型)
  • @Tander 没问题!如果答案是正确的,如果你愿意,你可以接受它;)。也有一个提示;架构组件还没有完全支持数据绑定,所以你可能会遇到一些问题。
猜你喜欢
  • 1970-01-01
  • 2019-07-01
  • 2020-12-31
  • 2018-09-22
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
相关资源
最近更新 更多