带有Android架构组件的MVVM

时间:2017-07-05 14:09:28

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

我正在探索新的Android架构组件并希望将其实施到Android应用中。我是MVVM的坚定者,因为我在iOS开发中使用范例。阅读了Google提供的Android体系结构组件指南:https://developer.android.com/topic/libraries/architecture/guide.html

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

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

我担心的是这个;谷歌似乎主张需要在每个ViewModel的基础上创建一个存储库类。这听起来非常错误,因为在应用程序中有这么多Singlton个类。如果我们有10个屏幕,有10个ViewModel--每个都需要自己的Repository module - 我们的应用程序中有十个单身人士。从iOS开发的角度来看,拥有这么多是错误的。

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

最佳做法是拥有一个存储库类,每个ViewModel - 还是每个应用程序有一个?我不是百分百肯定的。

最后,关于Room,我有同样的担忧 - 谷歌是说我们在每个ViewModel基础上创建数据库,还是每个应用只创建一个数据库?

1 个答案:

答案 0 :(得分:3)

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

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

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

  

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

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