具有 Android 架构组件的 MVVM

MVVM with Android Architecture Components

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

我有几个问题...

在上面提到的指南中,Google 使用 UserRepository class 访问这些网络服务 API - 他们继续制作这个 class Singleton 如果应用程序上只有一个屏幕需要来自 REST API 的数据,这可能没问题。

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

解决这个问题的方法是拥有一个中介(存储库)class,它具有 public 方法,公开 API 以从 REST [=36] 获取数据=]. Web 服务部分将在其自己的 class 中。这样,我们就可以很好地分离关注点。

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

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

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

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

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

Note: You should follow the singleton design pattern when instantiating an AppDatabase object, as each RoomDatabase instance is fairly expensive, and you rarely need access to multiple instances.

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