# SDI It is simple (in comparison with other systems) DI, which aim to be compatible and predictable. ## Platforms support * [x] JVM * [ ] JS * [ ] Native ## Required environment To use this library you will need two things: * Json serializer * Json config Unfortunately, currently not supported other formats (due to [issue in Kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization/issues/615)) ## Format of config Full examples of usage you can find in [tests](src/commonTest/kotlin/com/insanusmokrassar/sdi). In two words, there are a few rules for constructing of config: * Config root is an Json Object * Config root names will be used as dependency names * In the config dependency names can be used everywhere * In places, where dependency will be injected, must be used `@ContextualSerializer` annotation or `@Serializer(ContextSerializer::class)` ### Examples Lets imagine, that we have several interfaces and classes: ```kotlin package com.example // ... // interface ControllerAPI { fun showUp() } interface ServiceAPI { val names: List } @Serializable class Controller(@ContextualSerialization val service: ServiceAPI) : ControllerAPI { override fun showUp() { println("Inited with name \"${service.names}\"") } } @Serializable class BusinessService(override val names: List) : ServiceAPI ``` Here there is common way to create all of this directly: ```kotlin val service = BusinessService(listOf("One", "Two")) val controller = Controller(service) ``` And with config for this library: ```json { "service": [ "com.example.BusinessService", { "names": ["One", "Two"] } ], "controller": [ "com.example.Controller", { "service": "service" } ] } ``` List example you can find in [this test](https://git.insanusmokrassar.com/InsanusMokrassar/SDI/src/master/src/commonTest/kotlin/com/insanusmokrassar/sdi/ListTest.kt). Besides, usually you can create objects inside of places where expected something like dependency injection directly. In this case config will look like: ```json { "controller": [ "com.example.Controller", { "service": [ "com.example.BusinessService", { "names": ["One", "Two"] } ] } ] } ``` More expanded example you can find in [suitable test](https://git.insanusmokrassar.com/InsanusMokrassar/SDI/src/master/src/commonTest/kotlin/com/insanusmokrassar/sdi/SimpleCustomObjectTest.kt#L63).