ошибка: [dagger.android.AndroidInjector.inject (T)] Обнаружен цикл зависимости: - PullRequest
0 голосов
/ 04 января 2019

У меня есть класс SecurityService для получения токена с Rx2AndroidNetworking, для которого я установил OkHttpClient, который содержит перехватчик и аутентификатор, который также требует вызова токена, который вызывает у меня циклическую зависимость

Securityervice:

class SecurityService @Inject constructor(private val preferenceHelper: IPreferenceHelper, private val httpClient: ApiHttpClient): ISecurityService {


override fun getToken(request: TokenRequest): Observable<TokenResponse> =
        Rx2AndroidNetworking.post(ApiEndPoint.ENDPOINT_AUTHORIZATION_GET_TOKE)
                .addBodyParameter(request)
                .setOkHttpClient(httpClient.okHttpClient)
                .build()
                .getObjectObservable(TokenResponse::class.java)

override fun refreshToken(): Observable<TokenResponse> =
    Rx2AndroidNetworking.post(ApiEndPoint.ENDPOINT_AUTHORIZATION_REFRESH_TOKE + preferenceHelper.getRefreshToken())
        .setOkHttpClient(httpClient.okHttpClient)
        .build()
        .getObjectObservable(TokenResponse::class.java)


override fun revokeToken(): Observable<String> =
    Rx2AndroidNetworking.post(ApiEndPoint.ENDPOINT_AUTHORIZATION_REVOKE_TOKE + preferenceHelper.getAccessToken())
        .setOkHttpClient(httpClient.okHttpClient)
        .build()
        .getObjectObservable(String::class.java)

}

ApiHttpClient:

class ApiHttpClient @Inject constructor(preferenceHelper: IPreferenceHelper,
                                    securityService: ISecurityService,
                                    compositeDisposable: CompositeDisposable) {

 var okHttpClient: OkHttpClient = OkHttpClient().newBuilder()
    .addInterceptor(TokenInterceptor(preferenceHelper, securityService, compositeDisposable))
    .authenticator(ApiAuthenticator(preferenceHelper, securityService, compositeDisposable))
    .build()

}

ApiAuthenticator:

class ApiAuthenticator @Inject constructor(private val preferenceHelper: IPreferenceHelper,
                                       private val securityService: ISecurityService,
                                       private val compositeDisposable: CompositeDisposable)  :Authenticator {

override fun authenticate(route: Route, response: Response): Request? {
    compositeDisposable.add(securityService.refreshToken().subscribe({ tokenResponse ->
        if (tokenResponse != null) {
            preferenceHelper.let {
                it.setAccessToken(tokenResponse.access_token)
                it.setRefreshToken(tokenResponse.refresh_token)
                it.setTokenExpiresIn(tokenResponse.expires_in.toString())
                it.setUserAuthorities(tokenResponse.authorities.toString())
            }
        }
    }, { err -> Log.w("Authenticate error", err) })) //TODO: Send error message and request login.

    return response.request().newBuilder().build()
}

}

TokenInterceptor:

class TokenInterceptor @Inject constructor(private val preferenceHelper: IPreferenceHelper,
                                       private val securityService: ISecurityService,
                                       private val compositeDisposable: CompositeDisposable) :Interceptor {
override fun intercept(chain:Interceptor.Chain):Response {
    var token = preferenceHelper.getAccessToken()
    if(isTokenExpired(token)){
        compositeDisposable.add(securityService.refreshToken().subscribe({ tokenResponse ->
            if (tokenResponse != null) {
                token = tokenResponse.access_token
                preferenceHelper.let {
                    it.setAccessToken(token)
                    it.setRefreshToken(tokenResponse.refresh_token)
                    it.setTokenExpiresIn(tokenResponse.expires_in.toString())
                    it.setUserAuthorities(tokenResponse.authorities.toString())
                }
            }
        }, { err -> Log.w("Authenticate error", err) })) //TODO: Send error message and request login.
    }
    return chain.proceed(setAuthHeader(chain.request(),  token))
}

} * * тысяча двадцать-один

DI:

class AppModule {

@Provides
@Singleton
internal fun provideContext(application: Application): Context = application

@Provides
@Singleton
internal fun providePrefHelper(appPreferenceHelper: AppPreferenceHelper): IPreferenceHelper = appPreferenceHelper

@Provides
@Singleton
internal fun provideSecurityService(securityService: SecurityService): ISecurityService = securityService

@Provides
@Singleton
internal fun provideOkHttpClient(): ApiHttpClient = ApiHttpClient()

@Provides
@PreferenceInfo
internal fun providePrefFileName(): String = AppConstants.PREF_NAME

@Provides
internal fun provideCompositeDisposable(): CompositeDisposable = CompositeDisposable()

@Provides
internal fun provideSchedulerProvider(): SchedulerProvider = SchedulerProvider()

}

ОШИБКА:

    public abstract interface AppComponent {
            ^
  data.network.network.ISecurityService is injected at
     data.network.ApiHttpClient.<init>(…, securityService, …)
  data.network.ApiHttpClient is injected at
 data.network.services.SecurityService.<init>(…, httpClient)
  data.network.services.SecurityService is injected at
    di.module.AppModule.provideSecurityService$app_debug(securityService)
  data.network.network.ISecurityService is injected at
      ui.interactor.MainInteractor.<init>(…, securityService)
  ui.interactor.MainInteractor is injected at
  ui.main.MainActivityModule.provideMainInteractor$app_debug(mainInteractor)
  ui.main.interactor.IMainInteractor is injected at
  ui.main.presenter.MainPresenter.<init>(interactor, …)
  ui.main.presenter.MainPresenter<ui.main.view.IMainView,ui.main.interactor.IMainInteractor> is injected at
  ui.main.MainActivityModule.provideMainPresenter$app_debug(mainPresenter)
  ui.main.presenter.IMainPresenter<ui.main.view.IMainView,ui.main.interactor.IMainInteractor> is injected at
  ui.main.view.MainActivity.presenter
  ui.main.view.MainActivity is injected at dagger.android.AndroidInjector.inject(arg0)

Класс ApiHttpClient зависит от ISecurityService и IPreferenceHelper, но мне нужно предоставить ApiHttpClient при создании SecurityService. Это вызывает ошибку цикла зависимости. Как мне победить это, есть кто-нибудь сталкивался с этой проблемой? Заранее спасибо.

...