So far, we have talked about the code or framework that plays the role of dependency provider. It can be any custom code or full-fledged IoC container. Some developers refer to it as a DI container, but we will simply call it a container.
If we write custom code to supply dependency, things get smoother until we have just a single level of dependency. Take the scenario where our client classes are also dependent of some other modules. This results in chained or nested dependencies.
In this situation, implementing dependency injection will become quite complicated through manual code. That is where we need to rely on containers.
A container takes care of creating, configuring, and managing objects. You just need to do configuration, ...