存储库和用例之间有什么区别?

Mat*_*any 1 mvp android repository-pattern clean-architecture

我正在使用干净的体系结构创建一个聊天应用程序,我想检查用户在应用程序启动时是否已登录,如果用户未登录则打开登录屏幕,所以我的问题是:

  1. 最好的实现方法是什么?我是否应该LoginActivity启动启动器活动并检查LoginPresenter启动时间(如果用户已经登录)然后打开MainActivity?我应该把检查用户是否已通过身份验证的逻辑放在哪里(IsLoggedInUseCase也许?)?

  2. 我真的不了解存储库和用例之间的区别是什么,当已经有and 时,为什么还要创建一个GetAllUsersUseCaseand ..etc 。为什么要制作一个全新的类来引用存储库中已经存在的方法?EditUserUseCaseUsersRepository.getAllUsers()UsersRepository.editUser(User user)

sav*_*ion 7

简单来说,Use-Cases处理您的业务逻辑,Repositories就是存储和访问数据的数据层。

例如,当您打开启动器活动(我们称之为 SplashActivity)时

首先,您开始Presenter

mSplashPresenter.start();
Run Code Online (Sandbox Code Playgroud)

其次,在Presenter的start方法中,您是否实现了逻辑(无论用户是否登录)?如果是登录,请导航到仪表板,如果不是,请导航LoginActivity

我假设您有一个LoginUseCase。

public void start(){
      if(mLoginUseCase.isLoggedIn()){
          mView.navitageToDashboard();
      } else {
          mView.navigateToLogin();
      }
}
Run Code Online (Sandbox Code Playgroud)

第三,您需要一个如下的用例方法。(同样,我认为您有UserRepository

public boolean isLoggedIn(){
     // This is your business logic.
     return mUserRepository.getCurrentUser() != null;
}
Run Code Online (Sandbox Code Playgroud)

并在您的User Repository

public User getCurrentUser(){
    // This is your data 
    // You can access remote or local data with repository. 
    return mLocalDataSource.getUser();
}
Run Code Online (Sandbox Code Playgroud)

那么为什么我们需要用例呢? 这是一个简单的业务逻辑,它决定用户是否登录。这可能是更复杂的业务逻辑,或者您想在其他演示者中使用此逻辑。因此,使用Use-Cases,您可以使业务代码可重复使用,并避免在演示者中重复代码。

以后,如果您要决定更改登录逻辑,则仅更改用例,而不是所有演示者。

让我们为您的问题决定一个逻辑: EditUser

您有一个存储库方法 UsersRepository.editUser(User user)可编辑用户。

您有一个Profile屏幕,用户可以编辑所有字段。你也有一个EditScreenDetail屏幕,用户可以编辑一些与屏幕详细信息相关的字段,其他人可以看到这些字段。

在两个屏幕中,您都可以编辑用户,但是在调用UserRepository方法之前,您需要检查两个屏幕之间不同的必填字段。因此,您定义ProfileEditUseCaseScreenDetailsEditUseCase来实现两个不同的业务逻辑。但是最终操作是相同的。您可以通过仓库来编辑用户。来自远程或本地。

摘要:

Use-Cases您将业务逻辑与演示者和数据层分开时,请避免在演示者中重复代码。您还可以管理自己的业务,该业务可以在一类的其他部分中使用。

我希望我能清楚地解释。

  • @MathewHany在大多数情况下,如果在一个方法中组合多个方法,这是一种逻辑。通常,我们应该在用例方法中进行所有方法组合。因此,如果我们以后要更改逻辑,则仅涉及用例。储存库层应尽可能地虚设。存储库仅负责获取/保存数据。我们不要求存储库isLoggedIn(),而是要求getSession()。 (3认同)