【问题标题】:What is the difference between repositories and usecases?存储库和用例有什么区别?
【发布时间】:2017-08-20 16:22:48
【问题描述】:

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

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

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

【问题讨论】:

    标签: android repository-pattern mvp clean-architecture


    【解决方案1】:

    简单地说,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

    你有一个 Repository 方法 UsersRepository.editUser(User user) 编辑的是用户。

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

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

    总结:

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

    我希望我解释清楚。

    【讨论】:

    • LoginUseCase 是否应该只包含一种方法,isLoggedIn() 在这种情况下?为什么不在存储库中包含这个逻辑,比如 UserRepository.isLoggedIn() 而不是创建一个全新的类?
    • @MathewHany 在大多数情况下,如果在一个方法中组合多个方法,这是一个逻辑。通常我们应该在用例方法中进行所有方法组合。所以我们只接触用例,如果我们以后想改变逻辑。存储库层应尽可能虚拟。 Repository 只负责获取/保存数据。我们不要求存储库isLoggedIn(),我们要求getSession()
    猜你喜欢
    • 2018-04-20
    • 2015-09-15
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2016-02-27
    • 2013-12-28
    相关资源
    最近更新 更多