带有Android架构组件的MVVM

带有Android架构组件的MVVM,android,mvvm,android-room,android-architecture-components,Android,Mvvm,Android Room,Android Architecture Components,我正在探索新的Android架构组件,并希望将其应用到Android应用程序中。当我在iOS开发中使用范例时,我坚定地支持MVVM。阅读了谷歌提供的Android架构组件指南: 我只有几个问题 在上面提到的指南中,Google使用访问这些web服务API的UserRepository类-他们继续将该类设置为Singleton,如果应用程序上只有一个屏幕需要REST API的数据,那么这可能很好 我担心的是,;谷歌似乎主张需要在每个ViewModel的基础上创建一个repository类。这听起来

我正在探索新的Android架构组件,并希望将其应用到Android应用程序中。当我在iOS开发中使用范例时,我坚定地支持MVVM。阅读了谷歌提供的Android架构组件指南:

我只有几个问题

在上面提到的指南中,Google使用访问这些web服务API的
UserRepository
类-他们继续将该类设置为
Singleton
,如果应用程序上只有一个屏幕需要REST API的数据,那么这可能很好

我担心的是,;谷歌似乎主张需要在每个ViewModel的基础上创建一个repository类。这听起来很不对,因为应用程序中有这么多的
Singlton
类。如果我们有10个屏幕,10个视图模型——每个都需要自己的
存储库模块
——那么我们的应用程序中就有10个单例。从iOS开发人员的角度来看,拥有这么多是错误的

解决方案是使用一个中介(Repository)类,该类具有公共方法,公开API以从RESTAPI获取数据。Web服务部分将位于其自己的类中。这样,我们就有了合理的关注点分离

最好的做法是,每个ViewModel有一个存储库类,还是每个应用程序有一个?我不是100%确定


最后,当谈到
房间时,我也有同样的担忧——谷歌是说我们在每个视图模型基础上创建一个DB,还是说每个应用程序只创建一个DB

我不认为《体系结构指南》建议为每个ViewModel创建单独的存储库类。在本例中,Google使用一个名为Dagger的库将singleton repository类注入到ViewModel中。通常最佳做法是根据功能划分存储库(或管理器)。例如,UserRepository负责所有与用户相关的api调用

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

在快速查看房间后,我发现了这个小片段():

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


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

你真的读了太多关于一个简单页面和一个微不足道的例子。他们建立的体系结构可以很好地用于某些应用程序,而不适用于其他应用程序。多想想什么是有意义的,少复制粘贴指南。目的不是复制粘贴。但我明白你的意思。谢谢。谢谢你的信息;这确实有道理。接下来,假设我们在应用程序中有许多不同的RESTAPI,没有两个是相同类型的数据。那么,最好按功能对这些API进行分组,并将它们放入相关的回购协议中吗?我想,DB房间也是如此。比如说,该应用程序可以访问天气API和最新的赛车运动API(不相关的数据),因此它们需要单独的ViewModels。在这种情况下,我们是否需要两个房间DB和两个休息室?@Tander对于第一个场景,两个不同的rest API,您可能会查看数据,而不是与之交谈的实际端点。您可能希望ViewModels不知道数据的来源,ViewModel只想说:;getWeather()或类似的东西。如果您有一个从不同端点获取相关数据的不同数据源,我会将其放在同一个repo中。如果是不同的数据,我会把它放在不同的回购协议中。这与源无关,而是与数据类型有关。@Tander第二种情况并不现实,拥有两个完全独立的本地数据库有什么意义?我会把它们都合并到同一个房间的数据库中(当然是正确的关系设置)关于不看端点的问题,更重要的是,数据类型真的为我清除了它,谢谢。没错,ViewModel不应该知道,也不应该关心它获得的数据是否来自restapi或数据缓存,因此repo在那里是完美的。对于第二个用例;我同意,拥有多个DB似乎毫无意义。我们更希望有一个单人房DB,它可以保存朋友列表和当前天气的数据(两种不相关的数据类型)@Tander没问题!如果答案是正确的,如果愿意,您可以接受;)。还有一个提示;体系结构组件还没有完全支持数据绑定,因此您可能会遇到一些问题。