9

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

+0

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

Respuesta

3

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.

6
  1. Sí, se hace aún más difícil detectarlos mediante el uso de una capa adicional de abstracción.
  2. 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:

My answer en StackOverflow con un ejemplo de la extracción de la responsabilidad en una clase separada.

1

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.

Cuestiones relacionadas