【问题标题】:Is it correct to have a reference to a repository class in the view class when using MVVM?使用 MVVM 时在视图类中引用存储库类是否正确?
【发布时间】:2019-08-19 19:51:03
【问题描述】:

在 MyActivity 中,我正在尝试登录后端服务器。这是我尝试过的:

myViewModel = new ViewModelProvider(this, factory).get(MyViewModel.class);
myRepository = myViewModel.getMyRepository();

这是我的视图模型类:

public class MyViewModel extends ViewModel {
    private MyRepository myRepository;

    @Inject
    MyViewModel(MyRepository myRepository) {
        this.myRepository= myRepository;
    }

    MyRepository getMyRepository() {
        return myRepository;
    }
}

这是我的存储库类:

void signIn(Credential credential) {
    auth.signIn(credential).addOnCompleteListener(task -> {
        //Do stuff
    });
}

在我的活动类中引用我的存储库类是否正确?这种做法是否会干扰 mvvm 架构模式?


我问这个是因为我想知道是否可以在活动类中保留对存储库的引用,或者只保留视图模型的引用并在视图模型中创建存储库的对象?

【问题讨论】:

  • 不,视图 -> 视图模型 -> 存储库,您的视图中不应该有存储库,这违背了拥有视图模型的目的
  • @a_local_nobody 您好,感谢您的评论。请参阅我更新的问题的最后一部分。是一样的吗?
  • 我会为你添加一个正确的答案,至少在我看来:) 你是否同意我完全取决于你
  • @a_local_nobody 请给我一个答案来理解这个概念。谢谢
  • 好吧,这就是我的看法,如果你同意或不同意,请告诉我

标签: android mvvm android-architecture-components android-livedata android-viewmodel


【解决方案1】:

随着架构的发展,您的视图不应引用您的 Repository

View -> ViewModel -> Data/Model(在本例中是存储库)

您实际上是在使 ViewModel 毫无意义,它不会以任何有意义的方式对存储库中的数据进行格式化或更改与您正在做的事情(如果有的话,您的 viewmodel 变得更像是一种工厂模式),处理将现在必须在View 上完成(这对于架构来说是不正确的),因为我们试图实现一个“愚蠢”的视图,除了显示数据之外,视图上发生的处理逻辑尽可能少。使用这种方法,您也会失去LiveData 等技术;通过直接返回整个存储库,无法在ViewModel 中观察LiveData

请记住,这也会在一定程度上破坏其他架构/OOP 规则,因为您要返回一个完整的 repo,其中包含视图可用的所有方法,而不仅仅是几个必需的方法。

如果您想从存储库中获取响应,请查看:

  1. 将可观察的响应从存储库返回到视图模型
  2. 实现从存储库到视图模型的回调,并让视图模型将这些回调返回到视图

这样做与将存储库直接注入视图没有区别

【讨论】:

  • 感谢您抽出宝贵时间回答我的问题。现在一切都清楚了。
猜你喜欢
  • 1970-01-01
  • 2011-06-28
  • 2023-03-24
  • 2020-01-17
  • 2017-09-20
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
相关资源
最近更新 更多