Constructor DSL
Koin now offer a new kind of DSL keyword that allow you to target a class constructor directly, and avoid to have type your definition within a lambda expression.
For a given class ClassA
with following dependencies:
class ClassA(val b : ClassB, val c : ClassC)
class ClassB()
class ClassC()
you can now declare those components, directly targeting the class constructor
:
module {
singleOf(::ClassA)
singleOf(::ClassB)
singleOf(::ClassC)
}
No need to specify dependencies in constructor anymore with get()
function! 🎉
Be sure to use ::
before your class name, to target your class constructor
Your constructor is filled automatically with all get()
. Avoid using any default value as Koin will try to find it in the current graph.
If you need to retrieve a "named" definition, you need to use the standard DSL with lambda and get()
to specify the qualifier
Available Keywords
The following keywords are available to build your definition from constructor:
factoryOf
- equivalent offactory { }
- factory definitionsingleOf
- equivalent ofsingle { }
- single definitionscopedOf
- equivalent ofscoped { }
- scoped definition
Be sure to not use any default value in your constructor, as Koin will try to fill every parameter with it.
DSL Options
Any Constructor DSL Definition, can also open some option within a lambda:
module {
singleOf(::ClassA) {
// definition options
named("my_qualifier")
bind<InterfaceA>()
createdAtStart()
}
}
Usual options and DSL keywords are available in this lambda:
named("a_qualifier")
- give a String qualifier to the definitionnamed<MyType>()
- give a Type qualifier to the definitionbind<MyInterface>()
- add type to bind for given bean definitionbinds(listOf(...))
- add types list for given bean definitioncreatedAtStart()
- create single instance at Koin start
You can also to use bind
or binds
operator, without any need of lambda:
module {
singleOf(::ClassA) bind InterfaceA::class
}
Injected Parameters
With such kind of declaration, you can still use injected parameters. Koin will look in injected parameters and current dependencies to try to inject your constructor.
Like following:
class MyFactory(val id : String)
declared with Constructor DSL:
module {
factoryOf(::MyFactory)
}
can be injected like this:
val id = "a_factory_id"
val factory = koin.get<MyFactory> { parametersOf(id)}
Reflection Based DSL (Deprecated since 3.2)
Koin Reflection DSL is now deprecated. Please Use Koin Constructor DSL above