Key
data class Key<in C : Any, in A, out T : Any>(val contextType: TypeToken<in C>, val argType: TypeToken<in A>, val type: TypeToken<out T>, val tag: Any?)
In DI, each DIBinding is bound to a Key. A Key holds all information necessary to retrieve a factory (and therefore an instance).
A key contains many types & a tag. It defines the types of the values that will be passed to and retrieved from DI, not the values themselves.