If you are having issues with the management of dependencies in your code base, it might be time to start investigating the use of a DI framework. DI is a technique in which an object receives dependencies it needs through an "injection mechanism." There are several ways an object can receive its dependencies—through the constructor, a setter, or even with an interface that provides an injector method.
The best way to start using DI in a structured manner is through a framework because this gives you a helping hand in managing complex relationships between objects, the initialization process, and the lifespan of dependencies. In conclusion, you should start considering using a DI framework when you see tight coupling between classes and when their dependencies are becoming a bottleneck to writing consistent, testable, and maintainable code.