A common pattern is to separate the instantiation of an abstraction from the place you're using it. There are variety of ways to implement this in different technologies/frameworks.
The way Angular implements it is the way our team believes is the most scalable and expressive way. It has been tested in over 2k projects inside of Google and hundreds of thousands of external apps and seems to be working well.
At the same time, this is just a feature that the framework provides. Just like any other technology, you can pick what pieces of the entire system which works for you and ignore the rest. That's not part of the beginners journey and shouldn't be, especially for folks unfamiliar with the pros and cons of this approach.
The way Angular implements it is the way our team believes is the most scalable and expressive way. It has been tested in over 2k projects inside of Google and hundreds of thousands of external apps and seems to be working well.
At the same time, this is just a feature that the framework provides. Just like any other technology, you can pick what pieces of the entire system which works for you and ignore the rest. That's not part of the beginners journey and shouldn't be, especially for folks unfamiliar with the pros and cons of this approach.