Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Including scopeId param in experimental builders #252

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package org.koin.experimental.builder

import org.koin.core.parameter.ParameterDefinition
import org.koin.core.parameter.emptyParameterDefinition
import org.koin.core.scope.setScope
import org.koin.dsl.context.ModuleDefinition
import org.koin.dsl.definition.BeanDefinition
import org.koin.dsl.definition.Kind
Expand Down Expand Up @@ -51,14 +52,18 @@ inline fun <reified T : Any> ModuleDefinition.factory(
/**
* Create a Scope definition for given type T
*
* @param scopeId
* @param name
* @param override - allow definition override
*/
inline fun <reified T : Any> ModuleDefinition.scope(
scopeId: String,
name: String = "",
override: Boolean = false
): BeanDefinition<T> {
return provide(name, false, override, Kind.Scope) { create<T>() }
val beanDefinition = provide(name, false, override, Kind.Scope) { create<T>() }
beanDefinition.setScope(scopeId)
return beanDefinition
}

/**
Expand Down Expand Up @@ -101,14 +106,18 @@ inline fun <reified R : Any, reified T : R> ModuleDefinition.factoryBy(
/**
* Create a Scope definition for given type T, applied to R
*
* @param scopeId
* @param name
* @param override - allow definition override
*/
inline fun <reified R : Any, reified T : R> ModuleDefinition.scopeBy(
scopeId: String,
name: String = "",
override: Boolean = false
): BeanDefinition<R> {
return provide(name, false, override, Kind.Scope) { create<T>() as R }
val beanDefinition = provide(name, false, override, Kind.Scope) { create<T>() as R }
beanDefinition.setScope(scopeId)
return beanDefinition
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package org.koin.experimental.builder

import org.junit.Assert
import org.junit.Assert.fail
import org.junit.Test
import org.koin.dsl.module.module
import org.koin.error.NoScopeException
import org.koin.log.PrintLogger
import org.koin.standalone.StandAloneContext
import org.koin.standalone.get
import org.koin.standalone.getKoin
import org.koin.test.AutoCloseKoinTest

/**
* Scope DSL Test using experimental functions [scope] and [scopeBy]
* @see org.koin.test.scope.ScopeDSLTest
*/
class ScopeAutoBuilderDSLTest : AutoCloseKoinTest() {

interface IB
class A(val b: IB)
class B : IB

@Test
fun `use scope id from DSL`() {
StandAloneContext.startKoin(listOf(module {
scopeBy<IB, B>("session")
}), logger = PrintLogger(showDebug = true))

val koin = getKoin()

koin.createScope("session")

val b_1 = get<IB>()
val b_2 = get<IB>()

Assert.assertEquals(b_1, b_2)
}

@Test
fun `use closed scope id from DSL`() {
StandAloneContext.startKoin(listOf(module {
scope<B>("session")
}), logger = PrintLogger(showDebug = true))

val koin = getKoin()

val session = koin.createScope("session")
session.close()

try {
get<B>()
fail()
} catch (e: NoScopeException) {
}
}

@Test
fun `use scope id from DSL - dependency with same scope`() {
StandAloneContext.startKoin(listOf(module {
scopeBy<IB, B>("session")
scope<A>("session")
}), logger = PrintLogger(showDebug = true))

val koin = getKoin()

koin.createScope("session")

val b = get<IB>()
val a = get<A>()

Assert.assertEquals(a.b, b)
}

@Test
fun `use scope id and name from DSL`() {
StandAloneContext.startKoin(listOf(module {
scopeBy<IB, B>("session", "B1")
scopeBy<IB, B>("session", "B2")
}), logger = PrintLogger(showDebug = true))

val koin = getKoin()

koin.createScope("session")

val b_1 = get<IB>("B1")
val b_2 = get<IB>("B2")

Assert.assertNotEquals(b_1, b_2)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -160,16 +160,18 @@ class ModuleDefinition(
* Provide a Scope bean definition - scope provider
* (can be released/recreated with Scope API)
*
* @param scopeId
* @param name
* @param override - allow definition override
* @param definition
*/
inline fun <reified T : Any> scope(
scopeId: String,
name: String = "",
override: Boolean = false,
noinline definition: Definition<T>
): BeanDefinition<T> {
val beanDefinition = provide("", false, override, Kind.Scope, definition)
val beanDefinition = provide(name, false, override, Kind.Scope, definition)
beanDefinition.setScope(scopeId)
return beanDefinition
}
Expand Down