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

时间:2017-03-27 19:51:10

标签: android repository-pattern mvp clean-architecture

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

  1. 实施该方法的最佳方法是什么?如果用户已登录,我应该Get-WmiObject win32_operatingsystem -ComputerName (Get-Content C:\Users\user1\Desktop\Servers.csv) -Property name, csname | select csname, name | Format-Table -AutoSize 启动器活动并检查LoginActivity何时启动,然后打开LoginPresenter?我应该在哪里放置用于检查用户是否经过身份验证的逻辑(MainActivity可能?)?

  2. 我真的不明白存储库和用例之间有什么区别,为什么我应该IsLoggedInUseCaseGetAllUsersUseCase ...等等已经EditUserUseCaseUsersRepository.getAllUsers()?为什么要创建一个全新的类只是为了引用存储库中已存在的方法?

1 个答案:

答案 0 :(得分:5)

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

例如,当您打开Launcher活动时(让我们称之为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,您可以将业务逻辑与演示者和数据层分开,避免在演示者中复制代码。您还可以管理您的业务,可以在一个班级的其他部分中使用。

我希望我能清楚地解释清楚。