MVVM如何保存改造访问令牌



我通过Retrofit访问REST API,必须向每个请求添加承载令牌。不记名令牌在一小时后到期,此时需要刷新。为了刷新令牌,我有一个Retrofit Authenticator,当提供401并且API请求正常继续时,它会获得一个新的承载令牌。我还有一个OkHttp拦截器,它将更新的令牌添加到每个请求。我想将承载令牌保存到SharedPreferences,并让拦截器使用它,直到给出401,并且再次调用Authenticator。

我对MVVM很陌生,不知道应该把令牌保存逻辑放在哪里。由于使用承载令牌对访问数据至关重要,我认为让Authenticator和Interceptor处理保存/加载令牌可能是有意义的。这样做的一个缺点是,它打破了关注点分离的规则。存储库处理这个有意义吗?如果有,我该如何实现它?

使用MVVM,这就是我想要管理数据的方式。

[     Retrofit    ]-
- [Repository] - [ViewModel] - [View]
[SharedPreferences]-

任何建议都是非常感谢的!

您可以有一个SharedPreferenceManager类,它处理共享首选项的所有读/写逻辑。该类将有一个公共方法来保存/读取访问令牌。现在我相信您将有两个独立的类用于您的身份验证器和拦截器。只需将SharedPreferenceManager作为这两个类的依赖项(理想情况下作为构造函数参数)。现在,您可以轻松地将数据存储在Authenticator类中,并在Interceptor类中读取数据。这也使我们的类保持松散耦合,并且不会破坏关注点分离。

我认为这可能是有意义的认证器和拦截器处理保存/加载令牌。这样做的一个缺点是打破了关注点分离规则。

如果Interceptor本身包含SharedPref/Database存储逻辑,是的,它违反了规则。但如果它调用TokenStorage/TokenRepository/TokenManager等…那就好了。

存储库处理这个有意义吗?如果有,怎么能我执行它吗?

是的,如果InterceptorRepository都在同一个模块中,这是有意义的。Interceptor将调用Repository接口,而Repository实现将包含该存储逻辑。

最新更新