I do not draw a single line - the more the merrier.
What happens is that the more you can separate your API in small units, the closer you are to the principle of shared responsibility , because everything that is hidden behind the interface will tend to do only one thing and do it well.
By introducing interfaces into the implementation that implement new interfaces that are introduced into other types, etc., you get a very flexible structure where you can change the implementation details at almost any level, and each of them is quite simple in itself.
With a good DI container and some reasonable conventions, a DI container will automatically take care of most of the wiring for you, so the configuration should not be extreme.
Mark seemann
source share