KojextExtras (Experimental)
KojectExtras is experimental and the API may change in the future.
Koject creates a dependency graph at compile time, but sometimes you may need to add types created on a platform at runtime. KojectExtras
allows you to add dependencies at the start of Koject.
How to Use
Dependencies should be provided using the @Provides
annotation as much as possible, and KojectExtras
should be used when that is not possible.
First, implement the KojectExtras
interface and declare additional types to be provided using properties.
@ExperimentalKojectApi
class PlatformExtras(
val platformClass: PlatformClass // provide PlatformClass
): KojectExtras
Then specify its extras when calling Koject.start()
.
If not specified, MissingExtrasException
is thrown.
fun main() {
val platformExtras = PlatformExtras(/* ... */)
Koject.start {
@OptIn(ExperimentalKojectApi::class)
addExtras(platformExtras)
}
}
This allows PlatformClass
to be injected.
@Provides
class SomeClass(
val platformClass: PlatformClass, // can be injected
)
class SomeClass {
val platformClass: PlatformClass = inject() // can be injected
}
Advanced usage
In KojectExtras
, all non-private properties are treated as provides, and getters are also available.
@ExperimentalKojectApi
class GlobalExtras(
// provide SomeClass1
val someClass1: SomeClass1
): KojectExtras {
// provide SomeClass2
val someClass2: SomeClass2 = SomeClass2()
// provide SomeClass3
val someClass3: SomeClass3
get() = SomeClass3()
}
@Singleton
, @Qualifier
and @Named
annotations can be used.
@ExperimentalKojectApi
class GlobalExtras(
// provide as singleton
@Singleton
val someClass1: SomeClass1
): KojectExtras {
// provide with a qualifier
@SomeQualifier
val someClass2: SomeClass2 = SomeClass2()
// provide with a name
@Named("some-name")
val someClass3: SomeClass3
get() = SomeClass3()
}
@KojectExtrasMessage
can be used to change the error message when that extras is not set.
@ExperimentalKojectApi
@KojectExtrasMessage("error message for GlobalExtras")
class GlobalExtras(
val someClass: SomeClass
): KojectExtras