dave08
09/27/2017, 4:51 PMclass DeferredSingleton<T : Any>(builder: Kodein.Builder, override val createdType: TypeToken<Deferred<T>>, creator: NoArgBindingKodein.() -> T) : NoArgBinding<Deferred<T>> {
override fun factoryName() = "deferredSingleton"
private @Volatile var _instance: T? = null
private val _lock = Any()
init {
val key = Kodein.Key(Kodein.Bind(createdType, null), erased<Unit>())
builder.onProviderReady(key) { getInstance(this, key) }
}
override fun getInstance(kodein: NoArgBindingKodein, key: Kodein.Key<Unit, Deferred<T>>): Deferred<T> {
synchronizedIfNull(_lock, this::_instance, { return it }) {
_instance = kodein.creator()
}
return _instance!!
}
}
But creator() in the class params is not the same as the one being called (which is () -> Deferred<T>), and _instance returns T? instead of Deferred<T>?
Also, I really would like that val dep by injector.instance()
would return T
not Deferred<T>
and that the _instance initialize would be T
...