El año pasado, creé un nuevo sistema usando Inyección de dependencia y un contenedor de COI. ¡Esto me enseñó mucho sobre DI!
Sin embargo, incluso después de aprender los conceptos y patrones adecuados, considero que es un desafío desacoplar el código e introducir un contenedor IOC en una aplicación heredada. La aplicación es lo suficientemente grande como para que una implementación real sea abrumadora. Incluso si se entendió el valor y se concedió el tiempo. ¿A quién se le concede tiempo para algo como esto?
¡El objetivo, por supuesto, es llevar las pruebas unitarias a la lógica comercial!
Lógica empresarial que se entrelaza con llamadas de base de datos que evitan las pruebas.
He leído los artículos y entiendo los peligros de la inyección de dependencia del pobre como se describe en este artículo de Los Techies . Entiendo que realmente no desacopla nada.
Entiendo que puede involucrar mucha refactorización de todo el sistema ya que las implementaciones requieren nuevas dependencias. No consideraría usarlo en un nuevo proyecto con ninguna cantidad de tamaño.
Pregunta: ¿Está bien usar la DI de Poor Man para introducir la capacidad de prueba en una aplicación heredada y comenzar a rodar?
Además, ¿está utilizando la DI de Poor Man como un enfoque de base para la verdadera inyección de dependencia una forma valiosa de educar sobre la necesidad y los beneficios del principio?
¿Puede refactorizar un método que tiene una dependencia de llamada a la base de datos y abstraer esa llamada detrás de una interfaz? Simplemente tener esa abstracción haría que ese método sea comprobable ya que una implementación simulada podría pasarse a través de una sobrecarga del constructor.
En el futuro, una vez que el esfuerzo gane simpatizantes, el proyecto podría actualizarse para implementar un contenedor de COI y los constructores estarían allí para captar las abstracciones.
I consider it a challenge to decouple code and introduce an IOC container into a legacy application
por supuesto que lo es. Se llama deuda técnica. Es por eso que antes de cualquier renovación importante, es preferible refactores pequeños y continuos. Reducir los principales defectos de diseño y pasar a IoC sería menos difícil.Respuestas:
La crítica sobre la inyección de Poor Man en NerdDinner tiene menos que ver con si usas o no un contenedor DI que con la configuración correcta de tus clases.
En el artículo, afirman que
es incorrecto porque, si bien el primer constructor proporciona un mecanismo de respaldo conveniente para construir la clase, también crea una dependencia estrechamente vinculada a
DinnerRepository
.El remedio correcto, por supuesto, no es, como sugiere Los Techies, agregar un contenedor DI, sino más bien eliminar al constructor ofensor.
La clase restante ahora tiene sus dependencias correctamente invertidas. Ahora eres libre de inyectar esas dependencias como quieras.
fuente
XService
pasa un parámetro a unXRepository
y devuelve lo que devuelve no es demasiado útil para nadie y tampoco le da mucho en cuanto a la extensibilidad. Escriba sus pruebas unitarias para probar un comportamiento significativo y asegúrese de que sus componentes no sean tan estrechos que realmente esté cambiando toda su lógica a la raíz de su composición.Aquí haces una suposición falsa sobre lo que es la "DI del pobre".
Crear una clase que tenga un constructor de "atajo" que todavía cree acoplamiento no es la DI del pobre.
No usar un contenedor, y crear todas las inyecciones y mapeos manualmente, es la DI del pobre.
El término "DI del pobre" suena como algo malo. Por esa razón, el término "DI pura" se recomienda en estos días, ya que suena más positivo y en realidad describe con mayor precisión el proceso.
No solo es absolutamente correcto usar la DI pura / pobre del pobre para introducir la DI en una aplicación existente, sino que también es una forma válida de usar la DI para muchas aplicaciones nuevas. Y como usted dice, todos deberían usar DI puro en al menos un proyecto para comprender realmente cómo funciona DI, antes de asumir la responsabilidad de la "magia" de un contenedor de IoC.
fuente
Los cambios de paragidm en equipos / bases de código heredados son extremadamente riesgosos:
Usar un DI Framework como un martillo para romper todas las uñas solo hará que el código heredado sea peor que mejor en todos los casos. También es extremadamente arriesgado personalmente.
Incluso en los casos más limitados, como solo para que pueda usarse en casos de prueba, solo hará que esos casos de prueba sean "no estándar" y el código "extranjero" que, en el mejor de los casos, solo se marcarán
@Ignore
cuando se rompan o, peor aún, se quejarán constantemente Los programadores heredados con la mayor influencia en la administración y se reescriben "correctamente" con todo este "tiempo perdido en las pruebas unitarias", atribuido únicamente a usted.La inyección de dependencia es una solución que busca un problema.
La inyección de dependencia solo es útil en pequeñas dosis para un rango muy limitado de cosas:
Cosas que cambian mucho o tienen muchas implementaciones alternativas que están vinculadas estáticamente.
Sistemas de complementos que tienen complementos configurables que se pueden definir en el código de configuración en su marco y se descubren automáticamente al inicio y se cargan / recargan dinámicamente mientras se ejecuta el programa.
fuente