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

What is the difference between repositories and usecases?

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

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

  2. 我真的不明白存储库和用例之间的区别是什么,为什么我要制作 GetAllUsersUseCaseEditUserUseCase .. 等,当已经有 UsersRepository.getAllUsers()UsersRepository.editUser(User user)?为什么要创建一个全新的 class 只是为了引用存储库中已经存在的方法?

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

例如,当您打开启动器时 activity(我们称它为 SplashActivity

首先你开始你的Presenter

mSplashPresenter.start();

其次,在您的 Presenter 的启动方法中,您是否实现了用户是否登录的逻辑?如果是登录导航到仪表板,如果不是导航到 LoginActivity.

我假设你有一个 LoginUseCase。

public void start(){
      if(mLoginUseCase.isLoggedIn()){
          mView.navitageToDashboard();
      } else {
          mView.navigateToLogin();
      }
}

第三,你需要一个像下面这样的用例方法。 (我再次假设你有 UserRepository

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

在你的 User Repository:

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

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

稍后如果您想决定更改您的登录逻辑,您只需更改您的用例,而不是所有演示者。

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

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

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

在两个屏幕中您编辑用户但是在调用UserRepository方法之前您需要检查两个屏幕不同的必填字段。所以你定义了一个ProfileEditUseCaseScreenDetailsEditUseCase来实现两种不同的业务逻辑。但是最后的操作是一样的。您通过回购编辑用户。来自远程或本地。

总结:

使用 Use-Cases,您可以将业务逻辑与呈现器和数据层分开,避免呈现器中的代码重复。您还可以管理您的业务,这些业务可以在一个 class.

的其他部分使用

希望我解释清楚了。