He visto varios artículos en varios sitios web que proponen resolver las dependencias circulares entre ensamblados .NET mediante el uso de la inyección de dependencia. Esto puede resolver los errores de compilación, pero en realidad no está resolviendo la dependencia circular, ¿o sí? Para mí, parece haber todavía un error lógico en la arquitectura. ¿Estoy loco o los demás están de acuerdo 1) este es un uso menos que estelar de DI, y 2) no es la forma adecuada de resolver problemas de dependencia circular?resolviendo dependencias circulares con inyección de dependencia
Respuesta
DI no es para la resolución de dependencia circular, sino más bien para facilitar la creación de componentes muy bien desacoplados y por lo tanto más probables.
Si tiene dependencias circulares entre dos objetos, significa que necesita un tercer objeto, del cual los dos objetos dependerán, para que no dependan el uno del otro. Aquí está un artículo que es la solución exacta a su problema:
http://misko.hevery.com/2008/08/01/circular-dependency-in-constructors-and-dependency-injection/
+1 Gran enlace: ¡ese artículo lo explica muy bien! – Ergwun
- Sí, se hace aún más difícil detectarlos mediante el uso de una capa adicional de abstracción.
- Absolutamente no resuelve la dependencia circular, sino que la oculta añadiendo una capa adicional de abstracción, utilizando el límite tardío o acoplándola sin apretar.
Las mismas declaraciones de respuesta en los siguientes puestos (que voy a añadir referencias) que es crear una tercera clase en la que ambos dependen. Esto se traduce en: usted es que viola el Principio de Responsabilidad Individual. Al mover (extraer) la responsabilidad de la que dependen ambas clases en una clase separada, eliminará la dependencia circular.
FYI los Single Responsibility Pattern on Wikipedia
discusiones StackOverflow por otros:
- business-logic-layer-and-data-access-layer-circular-dependency
- are-circular-class-dependencies-bad-from-a-coding-style-point-of-view
My answer en StackOverflow con un ejemplo de la extracción de la responsabilidad en una clase separada.
voy a echar en mi $ 0,02 aquí, ya que me encontré con este post útil mediante la búsqueda de "la eliminación de dependencias cíclicas"
Sí. Puede usar DI para resolver dependencias circulares. El primer paso para solucionar cualquier problema es encontrarlo. Ninject se quejó de mi dependencia circular y lanzó una útil excepción en el arranque. Ninject lo encontró para mí y me obliga a solucionarlo. Podría engañar y usar inyección de propiedad o inyección de método, pero eso rompe mi protección de invariantes de clase (que creo que es por lo que te quejas).
Así que vote por la inyección de ctor a través de IoC porque detectará las dependencias circulares por usted. Depende de usted para refactorizar y eliminar el error arquitectónico.
- 1. Dependencia-inyección para resolver dependencias circulares
- 2. Resolviendo las dependencias circulares de Clojure
- 3. Dependencias circulares
- 4. Resolviendo dependencias circulares uniendo la misma biblioteca dos veces?
- 5. Tratando con dependencias circulares en IOC
- 6. Guice con dependencias circulares
- 7. Inyección de Dependencia con PowerShell
- 8. Dependencias circulares en StructureMap: ¿se pueden romper con la inyección de propiedades?
- 9. Resolviendo dependencias automáticas y manuales
- 10. Dependencias circulares frente a DRY
- 11. dependencias circulares entre dlls con visual studio
- 12. Inyección de dependencia con Jersey
- 13. Resolviendo las dependencias de maven
- 14. Inyección de dependencia con objetos NHibernate
- 15. Pregunta de inyección de dependencias
- 16. OO diseño y dependencias circulares
- 17. Inyección de dependencia en MVC
- 18. inyección de dependencias
- 19. Dependencias circulares de las declaraciones
- 20. alternativas de inyección de dependencia
- 21. Inyección de dependencia sin marco
- 22. Tratamiento de dependencias circulares en OCaml
- 23. ¿Cómo manejar las dependencias circulares con RequireJS/AMD?
- 24. Propósito de inyección de dependencias marcos
- 25. Inyección de Dependencia wcf
- 26. cómo evitar dependencias circulares aquí
- 27. La inyección de dependencia con múltiples repositorios
- 28. Inyección de dependencia con el archivo ".properties"
- 29. Inyección de Dependencia con Spring/Junit/JPA
- 30. Inyección de dependencia con interfaces o clases
Aunque, en general, se debe realizar un rediseño, aquí hay una referencia: http://stackoverflow.com/questions/1316518/how-did-microsoft-create-assemblies- that-have-circular-references/1316558# 1316558 – Dykam