Application entry points should be the composition root, as per Mark Seemann’s excellent book on Dependency Injection. Here, the issue is more about Dependency Inversion, whereby both client and implementation should both depend on abstractions.
What that diagram doesn’t show, but hopefully other parts of the book make clear, is that the entry point will naturally and necessarily reference everything that is needed to construct whatever are your resolution roots (controllers, services, etc.) But this is the only place that has such knowledge.
Bear in mind that it is sometimes ok for clients to ‘own’ the interfaces on which they depend: the interface ISecurityService
might live in the Controllers
assembly, the IUserRepository
might live in the ServiceImplementations
assembly, and so on. This is impractical when >1 client needs access to the interface, of course.
If you follow SOLID, you will naturally find that Dependency Injection is a necessity, but Inversion of Control containers are less of a priority. I find myself using Pure Dependency Injection (manual construction of resolution roots) more and more often.