diff --git a/koin-projects/examples/hello-ktor/src/main/kotlin/org/koin/sample/KtorApplication.kt b/koin-projects/examples/hello-ktor/src/main/kotlin/org/koin/sample/KtorApplication.kt index fc671ef54..c3c4a934e 100644 --- a/koin-projects/examples/hello-ktor/src/main/kotlin/org/koin/sample/KtorApplication.kt +++ b/koin-projects/examples/hello-ktor/src/main/kotlin/org/koin/sample/KtorApplication.kt @@ -6,6 +6,8 @@ import io.ktor.application.install import io.ktor.features.CallLogging import io.ktor.features.DefaultHeaders import io.ktor.response.respondText +import io.ktor.routing.Route +import io.ktor.routing.Routing import io.ktor.routing.get import io.ktor.routing.routing import io.ktor.server.engine.commandLineEnvironment @@ -41,6 +43,30 @@ fun Application.main() { get("/hello") { call.respondText(service.sayHello()) } + + v1() + } +} + +fun Routing.v1() { + + // Lazy inject HelloService from within a Ktor Routing Node + val service by inject() + + get("/v1/hello") { + call.respondText("[/v1/hello] " + service.sayHello()) + } + + bye() +} + +fun Route.bye() { + + // Lazy inject HelloService from within a Ktor Route + val service by inject() + + get("/v1/bye") { + call.respondText("[/v1/bye] " + service.sayHello()) } } diff --git a/koin-projects/examples/hello-ktor/src/test/kotlin/org/koin/sample/ApplicationJobRoutesTest.kt b/koin-projects/examples/hello-ktor/src/test/kotlin/org/koin/sample/ApplicationJobRoutesTest.kt index 08002413c..e170f2824 100644 --- a/koin-projects/examples/hello-ktor/src/test/kotlin/org/koin/sample/ApplicationJobRoutesTest.kt +++ b/koin-projects/examples/hello-ktor/src/test/kotlin/org/koin/sample/ApplicationJobRoutesTest.kt @@ -31,4 +31,29 @@ class ApplicationJobRoutesTest : AutoCloseKoinTest() { assertFalse(requestHandled) } } + + @Test + fun testV1HelloRequest() = withTestApplication(Application::main) { + with(handleRequest(HttpMethod.Get, "/v1/hello")) { + assertEquals(HttpStatusCode.OK, response.status()) + assertEquals("[/v1/hello] Hello Ktor & Koin !", response.content) + } + + with(handleRequest(HttpMethod.Get, "/index.html")) { + assertFalse(requestHandled) + } + } + + + @Test + fun testV1ByeRequest() = withTestApplication(Application::main) { + with(handleRequest(HttpMethod.Get, "/v1/bye")) { + assertEquals(HttpStatusCode.OK, response.status()) + assertEquals("[/v1/bye] Hello Ktor & Koin !", response.content) + } + + with(handleRequest(HttpMethod.Get, "/index.html")) { + assertFalse(requestHandled) + } + } } diff --git a/koin-projects/koin-ktor/src/docs/asciidoc/features.adoc b/koin-projects/koin-ktor/src/docs/asciidoc/features.adoc index 4806ec0e0..179b05535 100644 --- a/koin-projects/koin-ktor/src/docs/asciidoc/features.adoc +++ b/koin-projects/koin-ktor/src/docs/asciidoc/features.adoc @@ -51,9 +51,66 @@ fun Application.main() { } ---- +From `Routing` class: +[source,kotlin] +---- +fun Application.main() { + //... + + // Lazy inject HelloService + val service by inject() + + // Routing section + routing { + v1() + } +} + +fun Routing.v1() { + + // Lazy inject HelloService from within a Ktor Routing Node + val service by inject() + get("/v1/hello") { + call.respondText("[/v1/hello] " + service.sayHello()) + } +} +---- + + +From `Route` class: + +[source,kotlin] +---- +fun Application.main() { + //... + + // Lazy inject HelloService + val service by inject() + + // Routing section + routing { + v1() + } +} + +fun Routing.v1() { + hello() +} + +fun Route.hello() { + + // Lazy inject HelloService from within a Ktor Route + val service by inject() + + get("/v1/bye") { + call.respondText("[/v1/bye] " + service.sayHello()) + } +} + +---- diff --git a/koin-projects/koin-ktor/src/main/kotlin/org/koin/ktor/ext/KtorRouteExt.kt b/koin-projects/koin-ktor/src/main/kotlin/org/koin/ktor/ext/KtorRouteExt.kt new file mode 100644 index 000000000..4388f35e6 --- /dev/null +++ b/koin-projects/koin-ktor/src/main/kotlin/org/koin/ktor/ext/KtorRouteExt.kt @@ -0,0 +1,109 @@ +/* + * Copyright 2017-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.koin.ktor.ext + +import io.ktor.routing.Route +import org.koin.core.KoinContext +import org.koin.core.parameter.ParameterDefinition +import org.koin.core.parameter.emptyParameterDefinition +import org.koin.standalone.StandAloneContext + + +/** + * Ktor Koin extensions for Routing class + * + * @author Arnaud Giuliani + * @author Laurent Baresse + */ + +/** + * inject lazily given dependency + * @param name - bean name / optional + * @param module - module path + * @param parameters + */ +inline fun Route.inject( + name: String = "", + module: String? = null, + noinline parameters: ParameterDefinition = emptyParameterDefinition() +) = + lazy { (StandAloneContext.koinContext as KoinContext).get(name, module, parameters) } + +/** + * Retrieve given dependency for KoinComponent + * @param name - bean name / optional + * @param module - module path + * @param parameters + */ +inline fun Route.get( + name: String = "", + module: String? = null, + noinline parameters: ParameterDefinition = emptyParameterDefinition() +) = + (StandAloneContext.koinContext as KoinContext).get(name, module, parameters) + +/** + * lazy inject given property + * @param key - key property + * throw MissingPropertyException if property is not found + */ +inline fun Route.property(key: String) = + lazy { (StandAloneContext.koinContext as KoinContext).getProperty(key) } + +/** + * lazy inject given property + * give a default value if property is missing + * + * @param key - key property + * @param defaultValue - default value if property is missing + * + */ +inline fun Route.property(key: String, defaultValue: T) = + lazy { (StandAloneContext.koinContext as KoinContext).getProperty(key, defaultValue) } + +/** + * Retrieve given property for KoinComponent + * @param key - key property + * throw MissingPropertyException if property is not found + */ +inline fun Route.getProperty(key: String) = + (StandAloneContext.koinContext as KoinContext).getProperty(key) + +/** + * Retrieve given property for KoinComponent + * give a default value if property is missing + * + * @param key - key property + * @param defaultValue - default value if property is missing + * + */ +inline fun Route.getProperty(key: String, defaultValue: T) = + (StandAloneContext.koinContext as KoinContext).getProperty(key, defaultValue) + + +/** + * Help work on ModuleDefinition + */ +private fun context() = (StandAloneContext.koinContext as KoinContext) + +/** + * Set property value + * + * @param key - key property + * @param value - property value + * + */ +fun Route.setProperty(key: String, value: Any) = context().setProperty(key, value) \ No newline at end of file diff --git a/koin-projects/koin-ktor/src/main/kotlin/org/koin/ktor/ext/KtorRoutingExt.kt b/koin-projects/koin-ktor/src/main/kotlin/org/koin/ktor/ext/KtorRoutingExt.kt new file mode 100644 index 000000000..1a477734c --- /dev/null +++ b/koin-projects/koin-ktor/src/main/kotlin/org/koin/ktor/ext/KtorRoutingExt.kt @@ -0,0 +1,109 @@ +/* + * Copyright 2017-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.koin.ktor.ext + +import io.ktor.routing.Routing +import org.koin.core.KoinContext +import org.koin.core.parameter.ParameterDefinition +import org.koin.core.parameter.emptyParameterDefinition +import org.koin.standalone.StandAloneContext + + +/** + * Ktor Koin extensions for Routing class + * + * @author Arnaud Giuliani + * @author Laurent Baresse + */ + +/** + * inject lazily given dependency + * @param name - bean name / optional + * @param module - module path + * @param parameters + */ +inline fun Routing.inject( + name: String = "", + module: String? = null, + noinline parameters: ParameterDefinition = emptyParameterDefinition() +) = + lazy { (StandAloneContext.koinContext as KoinContext).get(name, module, parameters) } + +/** + * Retrieve given dependency for KoinComponent + * @param name - bean name / optional + * @param module - module path + * @param parameters + */ +inline fun Routing.get( + name: String = "", + module: String? = null, + noinline parameters: ParameterDefinition = emptyParameterDefinition() +) = + (StandAloneContext.koinContext as KoinContext).get(name, module, parameters) + +/** + * lazy inject given property + * @param key - key property + * throw MissingPropertyException if property is not found + */ +inline fun Routing.property(key: String) = + lazy { (StandAloneContext.koinContext as KoinContext).getProperty(key) } + +/** + * lazy inject given property + * give a default value if property is missing + * + * @param key - key property + * @param defaultValue - default value if property is missing + * + */ +inline fun Routing.property(key: String, defaultValue: T) = + lazy { (StandAloneContext.koinContext as KoinContext).getProperty(key, defaultValue) } + +/** + * Retrieve given property for KoinComponent + * @param key - key property + * throw MissingPropertyException if property is not found + */ +inline fun Routing.getProperty(key: String) = + (StandAloneContext.koinContext as KoinContext).getProperty(key) + +/** + * Retrieve given property for KoinComponent + * give a default value if property is missing + * + * @param key - key property + * @param defaultValue - default value if property is missing + * + */ +inline fun Routing.getProperty(key: String, defaultValue: T) = + (StandAloneContext.koinContext as KoinContext).getProperty(key, defaultValue) + + +/** + * Help work on ModuleDefinition + */ +private fun context() = (StandAloneContext.koinContext as KoinContext) + +/** + * Set property value + * + * @param key - key property + * @param value - property value + * + */ +fun Routing.setProperty(key: String, value: Any) = context().setProperty(key, value) \ No newline at end of file