Tengo relativamente poca experiencia en Dependency Injection, y me gustaría aprender algunas de las mejores prácticas y antipatrones para usar y evitar, respectivamente, cuando uso DI.Prácticas recomendadas de inyección de dependencias y antipatrones
Respuesta
He encontrado que cuando veo una violación del Law of Demeter es una pista de que podría querer una inyección de dependencia.
Por ejemplo:
void doit()
{
i += object.anotherobject.addvalue; //violation of Law of Demeter
}
insinúa que a veces puede ser que quiera inyectar a la dependencia anotherobject
.
Parece un poco arbitrario ... –
Esto tiene algún sentido, aunque es un pequeño salto, y está incompleto. Si encuentra una violación de la ley de demeter, encuentra la oportunidad de elegir el resumen. Cada vez que abstrae, tiene la oportunidad de elegir inyectar la dependencia en lugar de crearla usted mismo. Entonces este es un indicador, pero solo justo. Es posible que existan más oportunidades de abstracción que solo esto, y podría ser útil evitar la DI en lugares donde cuesta más implementar de lo que posiblemente podría obtenerse de ella. Aún así, +1 sin embargo. –
Mi regla básica sobre cuándo usar DI es que voy a inyectar entre capas, así que entre mi controlador y el dao sería una capa, por lo que puedo inyectar, por lo que si quiero simular una capa que pueda.
Creo que usar DI dentro de la misma capa no es una buena idea, principalmente porque la capa debe estar estrechamente unida, ya que están relacionadas, a menos que tenga una historia del usuario que la haga útil.
Por ejemplo, si su DAO puede estar en computadoras separadas, entonces puede necesitar pretender que son una capa, pero use DI para realmente cambiar entre todas las máquinas en una misma máquina. Entonces el desarrollador puede hacer todo en una máquina y debería funcionar en máquinas separadas.
Pero, a menos que haya alguna necesidad apremiante, creo que DI dentro de la misma capa es una complicación innecesaria.
Bien utilizando la inyección de dependencia dentro de una capa, volverá a utilizar las instancias de componentes existentes, conservando los recursos. También diría que está fomentando buenos hábitos de programación forzando un diseño modular. –
Acabo de ver que se está volviendo más complicado de lo que debe ser, pero eso depende de lo que hay en la capa. Tiendo a hacerlo entre capas, pero es por eso que expliqué por qué hacerlo entre capas puede ser útil, pero no es algo que pueda sugerir. –
En mi opinión, el libro de Dhanji Prasanna Dependency Injection es una lectura obligada para los diseñadores de software, tanto principiantes como expertos. Trata directamente con sus preguntas DI.
Otro gran libro es [Dependency Injection en .NET de Mark Seemann] (http://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/dp/1935182501). – Steven
Realmente disfruté este artículo con respecto a DI, ya que está dirigido a personas que no tienen mucha experiencia de DI, o ni siquiera saben de qué se trata.
https://mtaulty.com/2009/08/10/m_11554/
¿Cuál es la unidad?
It’s a “dependency injection container”.
Ahora, en ese momento un montón de gente leer esta dirá “Sí, sabemos y ya estamos usando por razones A, B, C o hemos optado por no utilizar que por razones X, y, Z”y me imagino un montón de otras personas podrían decir;
“Huh? What’s a dependency injection container?”
Este post es para las últimas personas - no está destinado a ser exhaustiva, sino es de esperar que no es completamente inútil ya sea :-)
Hay una sección de las mejores prácticas en Guice de user's guide.
He aquí un anti-patrón de inyección de dependencias: Multiple Constructors.
- 1. Prácticas recomendadas y antipatrones de Guice
- 2. Prácticas recomendadas para las dependencias de control de origen
- 3. Prácticas recomendadas de HttpRuntime.Cache
- 4. Prácticas recomendadas de Fragment
- 5. Prácticas recomendadas de JavaScript
- 6. Prácticas recomendadas de iFrame
- 7. Prácticas recomendadas de Google Apps y OAuth
- 8. ¿Prácticas recomendadas de UIView y UIViewController?
- 9. Denominación de cookies: prácticas recomendadas
- 10. C#: prácticas recomendadas Debug.Print
- 11. inyección de dependencias
- 12. Guice Y Scala - Inyección de Dependencias genéricos
- 13. Prácticas recomendadas de localización de Java
- 14. Prácticas recomendadas de cancelación de tareas
- 15. Prácticas recomendadas de funciones de espacio PHP
- 16. Administración de migración de rieles: ¿prácticas recomendadas?
- 17. MongoDB Estructura de base de datos y prácticas recomendadas Ayuda
- 18. Pregunta de inyección de dependencias
- 19. prácticas recomendadas de dbunit para el rendimiento
- 20. Autenticación de servicios web: ¿prácticas recomendadas?
- 21. Colección de ColdFusion CFC ¿Mejores/Prácticas recomendadas?
- 22. Alertas de SQL Server: prácticas recomendadas
- 23. Inyección de dependencias en las pruebas
- 24. Prácticas recomendadas para pruebas de integración de funciones de Eclipse
- 25. ClearCase UCM: prácticas recomendadas que usan componentes
- 26. Crear una tabla db Prácticas recomendadas NULL
- 27. Global de Estado y simple inyección de dependencias
- 28. Unidad de Pruebas: La tala y la inyección de dependencias
- 29. Propósito de inyección de dependencias marcos
- 30. Prácticas recomendadas de manejo de excepciones de base de datos
No creo que el "idioma-agnóstico" ayude aquí: diferentes idiomas dictan enfoques radicalmente diferentes: realmente no querría hacer lo mismo en C++ como, digamos, Ruby. –
Entonces, ¿valdría la pena hacer preguntas separadas por idioma?Aún así, me imagino que hay suficientes patrones generales, por lo que una pregunta genérica está en orden. – ripper234
Animo a todos los interesados en contribuir con esta pregunta a que revisen los temas [de inyección de dependencia] (http://stackoverflow.com/documentation/dependency-injection/topics) en su lugar. – dimo414