The vertical decomposition of a program is much more important than the horizontal, and »layers« should only present themselves as a kind of languages building on each other at consistent abstraction levels. I think any feeling of injection breaks these.
I cannot really make sense of the code you show, but I get a feeling that it reinvents parts of namespaces and parts of protocols.