【问题标题】:MVVM How To Save Retrofit Access TokenMVVM 如何保存改造访问令牌
【发布时间】:2021-10-01 14:00:54
【问题描述】:

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

我对 MVVM 非常陌生,不知道应该将令牌保存逻辑放在哪里。由于使用不记名令牌对访问数据至关重要,我认为身份验证器和拦截器处理保存/加载令牌可能是有意义的。这样做的一个缺点是这打破了关注点分离的规则。存储库处理这个是否有意义,如果可以,我该如何实现它?

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

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

非常感谢任何建议!

【问题讨论】:

    标签: android kotlin mvvm retrofit sharedpreferences


    【解决方案1】:

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

    【讨论】:

    • 使用 Hilt/Dagger 会是一种简单的实现方式吗?我无法从 Activity 外部访问共享首选项,因为它需要上下文。
    • 您可以使用任何您熟悉的 DI 框架来实现此目的。是的,您确实需要上下文来访问共享首选项,但它不必是活动/片段上下文。您还可以使用应用程序上下文来访问共享首选项。所有 DI 框架都为您提供访问应用程序上下文的方法。
    【解决方案2】:

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

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

    存储库处理这个问题是否有意义,如果可以,如何处理? 我实现了吗?

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

    【讨论】:

      猜你喜欢
      • 2013-07-11
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2020-07-25
      相关资源
      最近更新 更多