Primero, soy un programador de nivel de entrada; De hecho, estoy terminando un título de AS con un proyecto final final durante el verano. En mi nuevo trabajo, cuando no hay algún proyecto para mí (están esperando llenar el equipo con más nuevas contrataciones), me han dado libros para leer y aprender mientras espero: algunos libros de texto, otros no tanto (como Code Complete). Después de leer estos libros, recurrí a Internet para aprender lo más posible y comencé a aprender sobre SOLID y DI (hablamos sobre el principio de sustitución de Liskov, pero no sobre muchas otras ideas SOLID). Entonces, como he aprendido, me senté para aprender mejor y comencé a escribir algo de código para utilizar DI a mano (no hay marcos de DI en las computadoras de desarrollo).
La cosa es que, mientras lo hago, me doy cuenta de que me resulta familiar ... y parece que se parece mucho al trabajo que he hecho en el pasado usando la composición de clases abstractas usando polimorfismo. ¿Me estoy perdiendo una imagen más grande aquí? ¿Hay algo sobre DI (al menos a mano) que vaya más allá de eso? Entiendo la posibilidad de tener configuraciones que no están en el código de algunos marcos DI que tienen grandes beneficios en cuanto a cambiar las cosas sin tener que volver a compilar, pero cuando lo hago a mano, no estoy seguro de si es diferente de lo mencionado anteriormente ... ¡Una idea de esto sería muy útil!
fuente
El mejor artículo que he leído sobre el tema fue el de James Shore . He estado haciendo " DI a mano " durante años, como parte de la abstracción y el polimorfismo. Entonces, después de ingresar al mundo profesional y seguir escuchando ese término, tuve una gran desconexión entre lo que pensé que debería significar la palabra y lo que realmente significa:
Eso es de la publicación de Shore, que me aclaró todo. Por ejemplo:
Dado
En lugar de escribir:
Tu escribes algo como esto:
Y esto evita que la
Car
instancia tenga que manejarEngine
detalles específicos . Un automóvil solo necesita un motor, no le importa cuál, siempre y cuando implemente la funcionalidad básica del motor. Es decir, suCar
clase no está vinculada a una dependencia de implementación específica; se "inyecta" en otra parte, potencialmente en tiempo de ejecución.Este ejemplo específico de Car utiliza el subtipo de DI denominado "Inyección del constructor", lo que significa que la dependencia se transfirió como argumento del constructor. También puede usar un
setEngine(Engine a)
método para "Inyección de Setter", etc., pero estos subtipos me parecen pedantes.Sin embargo, un poco más lejos, muchos marcos DI proporcionan la base para conectar un grupo de estas cosas más abstractamente referenciadas entre sí.
Eso es.
fuente
No soy un experto, ya que solo comencé a usar DI en los últimos años, pero algunos de los temas / funcionalidades útiles de los contenedores DI que he notado son (que no considero como productos de composición / polimorfismo (pero puedo soportar ser corregido en eso):
fuente
Además de DI, hay una configuración de composición de clase en la aplicación raíz (en lugar de configurar usando xml). No hay necesidad de ningún marco DI o IoC, a pesar de que pueden ordenar la configuración de composición de clase, particularmente para proyectos grandes. Esto se debe a que el marco DI normalmente viene con un contenedor que implementa características adicionales, como el cableado automático, que ayuda a configurar la composición de la clase. Puede leer mi entrada de blog para extraer mi comprensión sobre este tema.
fuente