清洁架构登录流程

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

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

在启动画面上,我需要检查用户是否登录

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

  • 保存令牌

我应该在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并将令牌保存在presenter层中

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)
        }
    }

是否登录了与check用户相同的问题 . 我应该将该操作作为用例吗?

回答(1)

2 years ago

在我看来,在域层用例中执行该操作非常有意义 . 想象一下,你在电视应用的同一个项目中有另一个不同的模块 . LoginPresenter 可能与移动应用程序模块不同's one, however, you could be able to reuse the very same use case. Thus, you don' t必须注意您执行的每个 LoginPresenter 变体,以便在执行用例后保存令牌 .

另一方面,我建议在their Google I/O application中使用委托模式来了解Google的用户如何面对登录过程 . 在您的应用程序中使用 currentUser observable是一种非常常见的模式,为您提供了很多优势 . 例如,虽然我不会将其标记为纯粹的干净架构参考项目,但kickstarter的人们使用我所讨论的currentUser范例开发了一个有趣的 MVVM+RxJava 架构,值得一目了然 .