使用 MVVM 时,在视图 class 中引用存储库 class 是否正确?

Is it correct to have a reference to a repository class in the view class when using MVVM?

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

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

这是我的视图模型class:

public class MyViewModel extends ViewModel {
    private MyRepository myRepository;

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

    MyRepository getMyRepository() {
        return myRepository;
    }
}

这是我的存储库 class:

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

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


我问这个是因为我想知道是否可以在 activity class 中保留存储库的引用或仅保留视图模型的引用并在中创建存储库的对象视图模型?

您的视图不应引用您的 Repository,因为架构是这样的:

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

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

请记住,这在某种程度上也违反了其他 architecture/OOP 规则,因为您正在 return 使用视图可用的所有方法而不是只有几个必需的方法来访问整个存储库。

如果您想从您的存储库中获得回复,请查看:

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

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