干净的架构登录流程

时间:2018-11-04 17:17:55

标签: android clean-architecture

我正在使用干净的架构在Android应用程序中开发登录屏幕。

成功使用登录名后,我需要将令牌保存为共享首选项。

在启动屏幕上,我需要检查用户是否已登录

所以我的问题是,哪里是完美的地方:

  1. 要保存令牌

我应该将令牌保存在LoginUseCase(域层)中

class LoginUseCase(private val userRepository: UserRepository, private val schedulerProvider: SchedulerProvider) {

    fun execute(username: String, password: String): Single<Token> {
        return userRepository.login(username, password)
            .andThen(userRepository.saveToken(.....)
            .subscribeOn(schedulerProvider.getIOScheduler())
            .observeOn(schedulerProvider.getUIScheduler())
    }

}

或者我应该将令牌另存为UseCase并将令牌保存在演示者层中

class LoginPresenter(private val view: LoginContract.View,
                     private val setLoginStateUseCase: SetLoginStateUseCase,
                     private val loginUseCase: LoginUseCase,
                     private val schedulerProvider: SchedulerProvider): LoginContract.Presenter {

    private val compositeDisposable = CompositeDisposable()

    override fun performLogin(username: String, password: String) {

        if (username.isNullOrEmpty() || password.isNullOrEmpty()) {
            view.onShowLoginError("Field should not be empty")
        } else {
            view.showLoading()
            val disposable = loginUseCase.execute(username, password)
                    .subscribeOn(schedulerProvider.getIOScheduler())
                    .observeOn(schedulerProvider.getUIScheduler())
                    .andThen(setLoginStateUseCase.execute())
                    .subscribe({
                        view.hideLoading()
                        view.onLoginSuccess()
                    }, {error ->
                        view.hideLoading()
                        view.onShowLoginError(error.localizedMessage)
                    })
            compositeDisposable.add(disposable)
        }
    }

与支票用户相同的问题是否已登录。我应该将该操作作为用例吗?

1 个答案:

答案 0 :(得分:1)

我认为在域层用例中执行该操作非常有意义。假设您在同一项目中为电视应用程序拥有另一个模块。 LoginPresenter可能与移动应用程序模块的有所不同,但是,您可以重用相同的用例。因此,一旦用例执行完毕,您就不必知道为实现保存令牌而实施的每个LoginPresenter变体。

另一方面,我建议看一下Google的人们如何使用their Google I/O application中的委托模式来面对登录过程。在应用程序中使用可观察的currentUser是一种非常常见的模式,可为您带来很多好处。例如,尽管我不会将其标记为纯净的体系结构参考项目,但是kickstarter的家伙们使用我所讨论的currentUser范式开发了一种有趣的MVVM+RxJava架构,值得一看也。