El primer concepto importante de los contenedores de inyección de dependencias es que son un concepto muy diferente a la propia inyección de dependencias. Un contenedor es simplemente una utilidad que facilita la implementación de la inyección de dependencias. Lo malo es que en ocasiones el contenedor también se utiliza como un localizador de servicios (en inglés, service locator), que se considera un anti-patrón de diseño.
Si inyectas el contenedor en tus clases para poder acceder a los diferentes servicios, en realidad estás creando una dependencia mucho peor que la que tratas de evitar. Además tu código se vuelve mucho más difícil de testear.
La mayoría de frameworks modernos incluyen su propio contenedor de inyección de dependencias que permite configurar todas las dependencias mediante unos archivos de configuración sencillos. El la práctica esto significa que puedes desarrollar aplicaciones con un código muy limpio y totalmente desacoplado del framework que utilizas.