【问题标题】:Android MVVM ViewModel and Repositories for each entity?每个实体的 Android MVVM ViewModel 和存储库?
【发布时间】:2018-06-13 19:22:47
【问题描述】:

对于 Android 架构组件和 MVVM 模式,我有一些疑问。

基于网络上的大多数示例,通常都有简单的示例。

  1. 有一个 Room 实体
   @Entity
   public class User{
   ...
   }
  1. 有一个 DAO
    @Dao
    public interface UserDao{
    ...
    }
  1. 有一个存储库
   public class UserRepository{
    }
  1. 视图模型
    public class UsersListViewModel extends AndroidViewModel{
    ....
    }

现在让我们扩展它,在 user 旁边有 user_accessuser_actions 例如,所以有 3 个表。

问题:

  1. 我为 Room 中的每张桌子创建实体。我应该为每个实体(userDao、userAccessDao、userActionsDao)设置 3 个Dao 还是只是一个通用的AppDao 类?

  2. 存储库也是如此。整个应用程序的一个存储库或每个实体的存储库(RepositoryUser、RepositoryUserAccess、RepositoryUserActions?

  3. 如果我的应用有一个 main Activity 和多个 Fragment,我应该为每个 Fragment 创建一个 ViewModel 吗?

【问题讨论】:

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


    【解决方案1】:

    1

    你应该有上下文 DAO,比如说一个 UserDao,它应该包含与用户相关的查询,如果你的应用中有帖子,你应该有一个 PostDao,用于与帖子相关的所有内容。

    2

    存储库的逻辑相同,记住类的单一职责原则,坚持该原则,您应该为每种实体分开存储库(UserRepository、PostRepository...)。

    3

    遵循所有被描述为 Jetpack 的新概念,每个片段应该有一个视图模型,除非出于一个奇怪的原因,您有两个片段需要完全相同的逻辑,而且这不太可能发生,因为片段的目标是重复使用。

    【讨论】:

    • 我认为我们在重复自己,它不符合 DRY(不要重复自己)原则,因为我们在 Repository 和 ViewModel 中编写的代码几乎相同。
    • @ErcanDuman 你只写一次逻辑,你可以在任何你需要的地方使用它。
    • @EuryPérezBeltré 我有点同意你和 Ercan 的评论。我们会有很多冗余代码和多个模型,更不用说每个模型中的逻辑了。
    • @Napolean 那么你们没有抓住这个主意。 viewModel 可以共享,repositories 可以重用,冗余代码具体在哪里?
    • 如果我需要获取存储在另一个存储库中的 session_id 以获取用户详细信息怎么办? @Napolean 官方文档说不能重用视图模型不是一个好习惯。
    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    相关资源
    最近更新 更多