Создание различных свойств в модуле Koin с использованием параметров - PullRequest
0 голосов
/ 17 июня 2019

Я использую Koin как DI для моего приложения.Я создал модуль:

object NetworkModule {

fun get() = module {
    single {
        val localStorage: LocalStorage = get()
        val loggingInterceptor = HttpLoggingInterceptor()
        loggingInterceptor.level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY
        else HttpLoggingInterceptor.Level.NONE

        val authInterceptor = Interceptor { chain ->
            val original = chain.request()

            // Request customization: add request headers
            val requestBuilder = original.newBuilder()

            if (localStorage.deviceToken != null) {
                requestBuilder.addHeader("device_token", localStorage.deviceToken!!)
            }

            if (localStorage.authToken != null) {
                requestBuilder.addHeader("access_token", localStorage.authToken!!)
            }

            val request = requestBuilder.build()
            chain.proceed(request)
        }

        OkHttpClient.Builder()
            .connectTimeout(15, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .addInterceptor(authInterceptor)
            .addInterceptor(loggingInterceptor)
            .build()
    }

    single {
        Retrofit.Builder()
            .baseUrl(Const.BASE_API_URL)
            .client(get())
            .addConverterFactory(GsonConverterFactory.create(get()))
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()
            .create(Api::class.java)

В некоторых запросах я мог бы использовать AutheniticationInterceptor, а в других - нет.Как я могу построить свой HttpClient или Retrofit по-разному, учитывая такой случай.

Могу ли я передать некоторые параметры или что-то?Я просто потерян здесь.Любые предложения будут оценены.

Ответы [ 2 ]

3 голосов
/ 17 июня 2019

Вы можете использовать именованные свойства - например,

single<OkHttpClient>("auth"){
// here you pass the version with authinterceptor
}
single<OkHttpClient>("noAuth"){
// here you pass the version without authinterceptor
}

Затем в вашем методе get () вы передаете имя, например,

.client(get("auth"))
1 голос
/ 19 июня 2019

Вы можете сделать как ниже (Используйте последнюю версию koin для именованного свойства). Также я использую single и factory, потому что

single - объявляет одноэлементное определение данного типа. Коин хранит только один экземпляр этого определения

factory - объявить фабричное определение данного типа. Коин дает новый экземпляр каждый раз

factory(named("HEADERS")) {
        val map = it.get<MutableMap<String, String>>(0)
        Interceptor { chain ->
            val original = chain.request()
            val request = original.newBuilder()
            map.forEach { entry ->
                request.addHeader(entry.key, entry.value)
            }
            chain.proceed(request.build())
        }
    }

factory(named("auth")) {
        OkHttpClient.Builder().apply {
            map["AUTHORIZATION"] = "token"

            readTimeout(1, TimeUnit.MINUTES)
            connectTimeout(2, TimeUnit.MINUTES)
            writeTimeout(1, TimeUnit.MINUTES)
            addInterceptor(get(named("HEADERS"), parameters = {
               parametersOf(map)
            }))
        }.build()
    }

factory(named("auth")) {
        Retrofit.Builder()
                .baseUrl("base_url")
                .client(get(named("auth")))
                //.addCallAdapterFactory()
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(ApiService::class.java)
    }

single(named("noAuth")) {
        val map = mutableMapOf(ACCEPT to CONTENT_TYPE)
        OkHttpClient.Builder().apply {
            readTimeout(1, TimeUnit.MINUTES)
            connectTimeout(2, TimeUnit.MINUTES)
            writeTimeout(1, TimeUnit.MINUTES)
            addInterceptor(get(named("HEADERS"), parameters = {
                parametersOf(map)
            }))

        }.build()
    }

single(named("noAuth")) {
        Retrofit.Builder()
                .baseUrl("base_url")
                .client(get(named("noAuth")))
                //.addCallAdapterFactory()
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(ApiService::class.java)
    }
...