首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清洁体系结构登录流程

清洁体系结构登录流程
EN

Stack Overflow用户
提问于 2018-11-04 17:17:55
回答 1查看 3.3K关注 0票数 5

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

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

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

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

  1. 保存令牌

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

代码语言:javascript
复制
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并将令牌保存在演示程序层

代码语言:javascript
复制
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相同的问题是否登录。我应该把这个动作变成用例吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-10 23:33:11

在我看来,在域层用例中执行该操作非常有意义。假设您在同一个项目中有另一个不同的模块,用于一个电视应用程序。LoginPresenter可能与移动应用模块的不同,但是,您可以重用相同的用例。因此,在执行用例之后,您不必知道您实现的每个LoginPresenter变体都可以保存令牌。

另一方面,我建议看看谷歌的用户如何使用他们的Google I/O应用程序中的委托模式来面对登录过程。在您的应用程序中使用可观察到的currentUser是非常常见的模式,这给您带来了许多优势。例如,虽然我不认为它是一个纯干净的体系结构参考项目,但是kickstarter的工作人员使用我已经讨论过的MVVM+RxJava范例开发了一个有趣的currentUser体系结构,这也值得一看。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53143359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档