清洁架构和授权。正确的方法?

Der*_*k K 2 authentication android use-case clean-architecture

我正在使用Clean Architecture模式使用Android应用程序,并且对如何以干净的方式实现授权感到怀疑。就干净的体系结构而言,以下解决方案是否干净?

我将创建以下用例(从表示层执行):

  • LoginUseCase (对于提供的登录名和密码,可通过远程服务获取api令牌并保存在本地令牌源中)
  • LogoutUseCase(从中清除令牌LocalTokenSource

LocalTokenSource接口将存储在域层中,其实现将存储在数据层中-一种存储库)

并且为了在每次应用启动时执行令牌刷新(从用户角度来看这不是用例,对吗?),我将SessionManager在域层中创建组件。SessionManager将负责刷新令牌并将其保存在中LocalTokenSource。每次活动开始时,我都会从其主持人处执行refreshToken()注入SessionManager.操作。您如何看待解决方案?

如果很干净,那么如何处理将令牌传递到远程服务以执行其他需要令牌的API方法?可以说我有PostsRepository从远程服务中获取帖子数据的信息。我应该将令牌从用例传递到类似的存储库方法repo.getPosts(token)吗?还是注入LocalTokenSource存储库,以便它可以自己读取令牌?第二个选项不会因为LocalTokenSource使用2层而违反了Clean Architecture规则?

pla*_*ist 7

您必须决定的中心问题是:您是否要对授权(以及令牌的使用)进行建模,以将其建模为业务逻辑的一部分,还是要将其视为“实现细节”。

如果您为第一个决定使用专用的用例,则将SessionManager添加到域层并将令牌传递到存储库将是一致的建模。

如果您决定稍后再登录,则登录/注销/刷新以及令牌的存在可能最好“保留在幕后”,因此应保留在框架或网关层。

两种方法都将遵循“干净体系结构”的规则(只要您不违反依赖关系规则)。

  • 谢谢您的意见,现在我可以更有信心地工作了;-) (2认同)