Кодейн возвращает новый экземпляр вместо синглтона - PullRequest
0 голосов
/ 10 апреля 2020

Я новичок в Kodein, и у меня есть этот простой модуль:

import com.myapp.MyApplication.Companion.INSTANCE
import com.facebook.flipper.android.AndroidFlipperClient
import com.facebook.flipper.core.FlipperClient
import com.facebook.flipper.plugins.inspector.DescriptorMapping
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin
import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.kodein.di.Kodein
import org.kodein.di.generic.bind
import org.kodein.di.generic.instance
import org.kodein.di.generic.singleton

const val FLIPPER_MODULE_TAG = "FLIPPER_MODULE_TAG"

val flipperModule = Kodein.Module(FLIPPER_MODULE_TAG) {
    bind<NetworkFlipperPlugin>() with singleton {
        NetworkFlipperPlugin()
    }

    bind<FlipperClient>() with singleton {
        val networkFlipperPlugin: NetworkFlipperPlugin = instance()
        val client: FlipperClient = AndroidFlipperClient.getInstance(INSTANCE.baseContext)
        val inspectorFlipperPlugin =
            InspectorFlipperPlugin(INSTANCE, DescriptorMapping.withDefaults())
        client.addPlugin(networkFlipperPlugin)
        client.addPlugin(inspectorFlipperPlugin)
        client
    }

    bind<HttpClient>() with singleton {
        val logging = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
        val networkFlipperPlugin: NetworkFlipperPlugin = instance()
        val okHttpClientInstance = OkHttpClient.Builder().addNetworkInterceptor(FlipperOkhttpInterceptor(networkFlipperPlugin)).build()

        val httpClient = HttpClient(OkHttp) {
            engine {
                addInterceptor(logging)
                preconfigured = okHttpClientInstance
            }
        }
        httpClient
    }
}

Проблема в том, что

val networkFlipperPlugin: NetworkFlipperPlugin = instance()

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

Есть ли какие-либо указания на это? Большое спасибо!

1 Ответ

0 голосов
/ 11 апреля 2020

Я упустил кусок кода в своей деятельности:

 override val kodein: Kodein by retainedKodein {
        extend(parentKodein, copy = Copy.All)
    }

Как я уже сказал, я новичок в Кодейне :)

...