在我的移动应用程序中,我有一个单例 Ktor HttpClient,其不记名身份验证配置如下:
HttpClient(\xe2\x80\xa6) {\n install(Auth) {\n bearer {\n sendWithoutRequest { requestBuilder -> some condition }\n loadTokens(tokensStorage::getTokens)\n refreshTokens {\n performTokenRefresh(oldTokens.refreshToken)\n }\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n现在考虑以下流程:
\ntokenStorage无效。HttpClient令牌tokenStorage,请求失败并返回 401。HttpClient执行刷新,但也失败,因为刷新令牌无效。tokenStorage.HttpClient不再尝试调用loadTokens。确实,从源代码来看,loadTokens只被调用一次,然后就不会再被调用。我找到了解决该问题的几种方法。
\n第一个是手动BearerAuthProvider从HttpClient自己清除令牌,如以下代码片段所示,但这似乎是一种黑客解决方法:
httpClient.plugin(Auth).providers\n .filterIsInstance<BearerAuthProvider>()\n .first().clearToken()\nRun Code Online (Sandbox Code Playgroud)\ntokenStorage另一种方法是从 my in手动加载当前令牌refreshToken并忽略传入的内容this@refreshTokens.oldTokens …
在我的应用程序中,我有两个模块:app和repository。
repository依赖于 Room,并且有一个GoalRepository接口:
interface GoalRepository
Run Code Online (Sandbox Code Playgroud)
和一个GoalRepositoryImpl内部类,因为我不想将它或 Room 依赖项暴露给其他模块:
@Singleton
internal class GoalRepositoryImpl @Inject constructor(private val dao: GoalDao) : GoalRepository
Run Code Online (Sandbox Code Playgroud)
app取决于repository获取一个GoalRepository实例。目前,
我有一个:GoalRepositoryModule
@Module
class GoalRepositoryModule {
@Provides
@Singleton
fun provideRepository(impl: GoalRepositoryImpl): GoalRepository = impl
@Provides
@Singleton
internal fun provideGoalDao(appDatabase: AppDatabase): GoalDao = appDatabase.goalDao()
@Provides
@Singleton
internal fun provideDatabase(context: Context): AppDatabase =
Room.databaseBuilder(context, AppDatabase::class.java, "inprogress-db").build()
}
Run Code Online (Sandbox Code Playgroud)
问题是这不会编译(显然),因为公共provideRepository函数正在公开GoalRepositoryImpl,即一个internal类。
如何构建我的 Dagger …