我正在探索新的Android架构组件,并希望将其实现到一个Android应用程序中。当我在iOS开发中使用MVVM时,我对MVVM非常了解。阅读了Google提供的Android Architecture Components guide:https://developer.Android.com/topic/libraries/Architecture/guide.html
我有几个问题...
在上面提到的指南中,Google使用UserRepository
类访问这些web服务API-他们继续使该类成为singleton
,如果应用程序上只有一个屏幕需要来自REST API的数据,这可能是很好的。
我关心的,是这个;似乎Google提倡在每个ViewModel的基础上创建一个存储库类。这听起来很不对,因为有这么多singlton
类在应用程序。如果我们有10个屏幕,有10个ViewModel,每个都需要自己的存储库模块
,那么我们的应用程序中就有10个单例。从iOS开发人员的角度来看,有这么多是不对的。
解决这一问题的方法是有一个mediator(存储库)类,它具有公共方法,公开API以从REST API获取数据。Web服务部分将在它自己的类中。这样,我们就有了一个体面的问题分离。
拥有一个存储库类per,ViewModel是最佳实践吗?还是每个应用程序拥有一个存储库类?我对此不是百分之百肯定。
最后,对于room
,Google是说我们在每个ViewModel基础上创建一个数据库,还是每个应用只创建一个数据库?
我不认为架构指南建议为每个ViewModel创建单独的存储库类。在所示的示例中,Google使用一个名为Dagger的库将singleton repository类注入到ViewModel中。在功能上拆分存储库(或管理器)通常是最佳实践。例如,UserRepository负责所有与用户相关的api调用。
如果您将此存储库转换为可以注入到任何ViewModel中的单例,那么任何ViewModel现在都可以访问该特定存储库。
在快速查看房间后,我发现了这个小片段(链接):
注意:在实例化AppDatabase对象时,您应该遵循singleton设计模式,因为每个RoomDatabase实例都相当昂贵,而且您很少需要访问多个实例。
对我来说,这意味着您可以以使用存储库类的方式实现RoomDatabase。只需将它们作为一个单例注入ViewModel,这样就不需要拥有同一个数据库的多个实例。