Skip to content

Instantly share code, notes, and snippets.

@s4cha
Last active June 18, 2019 13:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save s4cha/7b9ab4350ca2f5b746928da85cb5fc81 to your computer and use it in GitHub Desktop.
Save s4cha/7b9ab4350ca2f5b746928da85cb5fc81 to your computer and use it in GitHub Desktop.
Single Injection Container in pure Kotlin
typealias ServiceBuilderBlock<T> = () -> T
class ServiceBuilderkWrapper<T>(val serviceBuilderBlock:ServiceBuilderBlock<T>, val serviceName: String)
object InjectionContainer {
var serviceBuilderkWrappers = mutableListOf<ServiceBuilderkWrapper<Any>>()
inline fun <reified T>registerService(noinline block: ServiceBuilderBlock<T>) {
val wrapper = ServiceBuilderkWrapper(block, T::class.simpleName ?: "noname") as ServiceBuilderkWrapper<Any>
serviceBuilderkWrappers.add(wrapper)
}
inline fun <reified T> getService(): T {
val serviceWrapper = serviceBuilderkWrappers.first { it.serviceName == T::class.simpleName }
val block = serviceWrapper.serviceBuilderBlock as ServiceBuilderBlock<T>
val instance = block()
return instance
}
}
// Your service interface
interface PhotoService {
fun fetchPhoto(): String
}
class App {
fun run() {
// Register your service.
InjectionContainer.registerService<PhotoService> {
MyPhotoService()
}
}
}
class Fragment {
fun usage() {
val photoService: PhotoService = InjectionContainer.getService()
photoService.fetchPhoto()
}
}
// Your injected service
class MyPhotoService: PhotoService {
override fun fetchPhoto(): String {
return "Yay! Photo"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment