Как внедрить репозиторий в перехватчик в компонентах архитектуры Android? - PullRequest
0 голосов
/ 05 марта 2019

Я хочу написать Аутентификационный перехватчик, который является токеном доступа загрузки из локальной базы данных и добавить к заголовку запроса в android Проектный компонент компонентов архитектуры .

Класс AuthenticationInterceptor:

class AuthenticationInterceptor: Interceptor, Authenticator {

   /*...*/

   override fun intercept(chain: Interceptor.Chain): Response {
        var request = chain.request()
        if (!request.url().encodedPath().equals("/login", ignoreCase = true)) {
           tokenRepository.getAccessToken().let {
              request = request?.newBuilder()
                    ?.addHeader("Authentication", "Bearer " + it)
                    ?.build()
           }
        }
        return chain.proceed(request)
   }

   override fun authenticate(route: Route, response: Response): Request? {
        /*...*/
   }
}

Класс AppModule, в котором добавляется перехватчик к OkHttpClient:

@Module(includes = [ViewModelModule::class])
class AppModule {
    /*...*/

    @Singleton
    @Provides
    fun provideTokenService(): TokenService {
       return Retrofit.Builder()       
           .client(
                   OkHttpClient.Builder()
                 .addNetworkInterceptor(AuthenticationInterceptor()).build()
           )
           .baseUrl("http://localhost:8080")
           .addConverterFactory(GsonConverterFactory.create())
           .addCallAdapterFactory(LiveDataCallAdapterFactory())
           .build()
           .create(TokenService::class.java)
    }

    /*...*/
}

Я пытаюсь добавить репозиторий в конструктор, но затем приходится вставлять репозиторий в AppModule, что вызывает ошибку сборки

class AuthenticationInterceptor @Inject constructor(val tokenRepository: TokenRepository): Interceptor, Authenticator {

Если я добавлю хранилище в поле класса, тогда хранилище будет нулевым

@Inject lateinit var tokenRepository: TokenRepository

Так что мой вопрос, как внедрить хранилище в перехватчик?

1 Ответ

0 голосов
/ 06 марта 2019

Хорошо, я решаю свою проблему:

  • первое: я использую инжектор конструктора на перехватчике
  • секунда: я не создаю новый экземпляр вручную вместо добавления перехватчика к провайдеруparam:

    fun provideTokenService (authInterceptor: AuthenticationInterceptor): TokenService {

  • третий: вторая точка вызвала зависимость круга, потому что хранилище использует службу, поэтому я неиспользуйте репозиторий в перехватчике, вместо этого используйте dao (или создайте другой репозиторий, который не использует сервис)

...