dependency-injection - inyección - spring ioc
Diferencia entre “Inversión de control”, “Inversión de dependencia” y “Desacoplamiento” (3)
Encuentro que la siguiente explicación de DIP en el artículo de Wild en martinfowler.com es fácil de entender (aquí DI = Inyección de dependencia, DIP = Principio de inversión de dependencia, IoC = Inversión de control):
DI es acerca de cómo un objeto adquiere una dependencia. Cuando se proporciona una dependencia externa, entonces el sistema está utilizando DI. IoC se trata de quién inicia la llamada. Si su código inicia una llamada, no es IoC, si el contenedor / sistema / biblioteca vuelve a llamar al código que le proporcionó, es IoC.
DIP, por otro lado, es sobre el nivel de la abstracción en los mensajes enviados desde su código a lo que está llamando. (...) DI es sobre cableado, IoC es sobre dirección y DIP es sobre forma [del objeto del cual depende el código].
Estoy leyendo la teoría sobre la inversión de la dependencia y el desacoplamiento y no puedo ver la diferencia entre los dos.
La inversión de dependencia se refiere al desacoplamiento de los componentes funcionales para que los componentes de nivel superior no dependan de los componentes de nivel inferior.
El desacoplamiento habla de lo mismo y cómo lograrlo. Pero luego tenemos Contenedores IoC que ensucian aún más las cosas. ¿Por qué no son más bien llamados contenedores de inversión de dependencia o incluso mejores contenedores de inyección de dependencia , porque sirven de acoplamiento en tiempo de ejecución de componentes independientes?
Entonces tenemos Inversión de Control . Es básicamente lo mismo que la inversión de dependencia, ¿no es así? ¿Por qué hay tres términos que describen lo mismo? ¿O soy ciego?
- ¿Cuál es la diferencia entre los tres?
- ¿Qué tiene que hacer IoC en los Contenedores IoC?
El desacoplamiento es un principio muy general aplicable en muchos campos. La inversión de dependencia es una forma específica de desacoplamiento donde se desacopla los niveles más altos de su sistema de los niveles más bajos al separarlos en bibliotecas y usar interfaces. Esto le permite reemplazar partes de nivel inferior de su sistema sin necesidad de realizar mayores trabajos.
Por ejemplo, en lugar de que las partes de nivel superior del sistema creen instancias concretas de las clases de nivel inferior, se puede usar un contenedor de IoC para desacoplar cómo se crean los objetos.
La inversión de control es un principio de diseño utilizado por las bibliotecas de marcos que permiten que el marco recupere algo de control de la aplicación. Es decir, un marco de ventanas puede volver a llamar al código de la aplicación cuando se producen ciertos eventos de la interfaz de usuario. Martin Fowler usa el término Principio de Hollywood como en No nos llames, te llamaremos . El desacoplamiento es una parte importante de la inversión de control.
¿Pero qué tiene que ver un contenedor IoC con la inversión de control? Para citar a Martin Fowler :
Inversión de control es un término demasiado genérico, y por eso la gente lo encuentra confuso. Como resultado de una gran cantidad de discusión con varios defensores de la IoC, nos decidimos por el nombre de inyección de dependencia.
(Tenga en cuenta que Martin Fowler habla de inyección de dependencia , no de inversión de dependencia ).
Un contenedor IoC ayuda a implementar la inyección de dependencia y quizás un término mejor sería contenedor de inyección de dependencia. Sin embargo, el nombre del contenedor IoC parece pegarse. La inyección de dependencia es un componente importante en la inversión de dependencia, pero el uso de contenedores IoC para la inyección de dependencia puede ser confuso ya que la inversión de control es un principio más amplio y más genérico.
Señala que la denominación no es muy coherente, pero eso no debería ser una gran sorpresa, ya que estos términos se han inventado y utilizado de manera independiente, aunque se superpongan.
La inyección de dependencia logra el desacoplamiento mediante la inversión de control .