Throw more descriptive exception when service isn't found

This commit is contained in:
Pavel V. Talanov
2018-03-26 20:21:12 +02:00
parent da56f54982
commit 3aee544f02
2 changed files with 7 additions and 2 deletions
@@ -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")