Throw more descriptive exception when service isn't found
This commit is contained in:
@@ -38,7 +38,7 @@ object DynamicComponentDescriptor : ValueDescriptor {
|
|||||||
override fun toString(): String = "Dynamic"
|
override fun toString(): String = "Dynamic"
|
||||||
}
|
}
|
||||||
|
|
||||||
class StorageComponentContainer(id: String, parent: StorageComponentContainer? = null) : ComponentContainer, ComponentProvider, Closeable {
|
class StorageComponentContainer(private val id: String, parent: StorageComponentContainer? = null) : ComponentContainer, ComponentProvider, Closeable {
|
||||||
val unknownContext: ComponentResolveContext by lazy {
|
val unknownContext: ComponentResolveContext by lazy {
|
||||||
val parentContext = parent?.let { ComponentResolveContext(it, DynamicComponentDescriptor) }
|
val parentContext = parent?.let { ComponentResolveContext(it, DynamicComponentDescriptor) }
|
||||||
ComponentResolveContext(this, DynamicComponentDescriptor, parentContext)
|
ComponentResolveContext(this, DynamicComponentDescriptor, parentContext)
|
||||||
@@ -104,6 +104,8 @@ class StorageComponentContainer(id: String, parent: StorageComponentContainer? =
|
|||||||
val args = constructorBinding.argumentDescriptors.map { it.getValue() }.toTypedArray()
|
val args = constructorBinding.argumentDescriptors.map { it.getValue() }.toTypedArray()
|
||||||
return constructorBinding.constructor.newInstance(*args) as T
|
return constructorBinding.constructor.newInstance(*args) as T
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun toString() = "Container $id"
|
||||||
}
|
}
|
||||||
|
|
||||||
fun StorageComponentContainer.registerSingleton(klass: Class<*>): StorageComponentContainer {
|
fun StorageComponentContainer.registerSingleton(klass: Class<*>): StorageComponentContainer {
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ fun <T : Any> ComponentProvider.tryGetService(request: Class<T>): T? {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun <T : Any> ComponentProvider.getService(request: Class<T>): T {
|
fun <T : Any> ComponentProvider.getService(request: Class<T>): T {
|
||||||
return tryGetService(request) ?: throw IllegalArgumentException("Unresolved service: $request")
|
return tryGetService(request) ?: throw UnresolvedServiceException(this, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun StorageComponentContainer.useInstance(instance: Any) {
|
fun StorageComponentContainer.useInstance(instance: Any) {
|
||||||
@@ -49,3 +49,6 @@ fun StorageComponentContainer.useInstance(instance: Any) {
|
|||||||
inline operator fun <reified T : Any> ComponentProvider.getValue(thisRef: Any?, desc: KProperty<*>): T {
|
inline operator fun <reified T : Any> ComponentProvider.getValue(thisRef: Any?, desc: KProperty<*>): T {
|
||||||
return getService(T::class.java)
|
return getService(T::class.java)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class UnresolvedServiceException(container: ComponentProvider, request: Class<*>) :
|
||||||
|
IllegalArgumentException("Unresolved service: $request in $container")
|
||||||
Reference in New Issue
Block a user