requiere referencia que dependencia clase c# oop circular-dependency

c# - que - ¿Cómo resolver la referencia circular?



referencia circular c# (5)

¿Cómo se resuelven los problemas de referencia circular como la clase A tiene la clase B como una de sus propiedades, mientras que la clase B tiene la clase A como una de sus propiedades?

¿Cómo hacer arquitecto para ese tipo de problemas?

Si toma un ejemplo de NHibernate, habrá una relación padre-hijo entre los objetos.

¿Cómo es capaz de manejar esos escenarios de padres e hijos?


A diferencia de C ++ (por ejemplo), C # no necesita declaraciones directas para resolver referencias circulares. Por lo tanto:

public class A { public B B { get;set; } } public class B { public A A { get;set; } }

Sin embargo, esto a menudo es un indicador de decisiones de diseño cuestionables.


Le diría a tu amigo que necesita replantearse su diseño. Las referencias circulares como usted describe a menudo son un olor a código de un defecto de diseño.


En la mayoría de los casos, cuando tuve que hacer dos cosas para hacer referencia entre sí, creé una interfaz para eliminar la referencia circular. Por ejemplo:

ANTES DE

public class Foo { Bar myBar; } public class Bar { Foo myFoo; }

Gráfico de dependencia:

Foo Bar ^ ^ | | Bar Foo

Foo depende de Bar, pero Bar también depende de Foo. Si están en ensamblajes separados, tendrá problemas para construir, especialmente si realiza una reconstrucción limpia.

DESPUÉS

public interface IBar { } public class Foo { IBar myBar; } public class Bar : IBar { Foo myFoo; }

Gráfico de dependencia:

Foo, IBar IBar ^ ^ | | Bar Foo

Tanto Foo como Bar dependen de IBar. No hay dependencia circular, y si IBar se coloca en su propio ensamblaje, Foo y Bar estarán en ensamblajes separados ya no serán un problema.


En la mayoría de los casos, la mejor solución es cambiar su diseño y evitar una dependencia circular. Por ejemplo, puede hacer una de las siguientes cosas:

  1. Mueva el código de referencia común a un proyecto de utilidad en su solución y haga que los otros proyectos hagan referencia al proyecto de utilidad.
  2. Use una interfaz como explica "Ed Bayiates" en su respuesta.
  3. Si es una pequeña cantidad de código simple / común, reescríbelo para una de las clases, por lo que no necesita referenciarlo en una dependencia circular. (mi menos favorito)

Sin embargo, si está trabajando en una solución con muchos proyectos y no tiene la capacidad de realizar uno de los cambios anteriores porque no posee el código, es difícil de implementar o no vale la pena arreglarlo, entonces puedes usar este método:

Haga clic derecho en las referencias del proyecto y seleccione "Agregar referencia ...". Luego, en la ventana de diálogo que aparece, cambie a la pestaña "Examinar" y al botón "Buscar". Desde allí, puede buscar la DLL y seleccionarla. En el mejor de los casos, se trata de una solución y puede causar problemas de compilación, especialmente si ambas DLL se actualizan con frecuencia o tienen muchas dependencias. No recomiendo este método, pero funciona en un apuro.

Fissh


Las interfaces son una buena idea; sin embargo, si buscas una solución más rápida que rehacer la arquitectura de tantas cosas, intenta construir una biblioteca de clase dll que contenga todas tus estructuras de datos. Tu proyecto principal contiene tu UI que necesita esos datos y luego cualquier otro dll que quieras agregar también puede acceder a las estructuras de datos dll para que tengan toda la información que necesitan para ejecutar, pero aún pueden separarse; esto se llama patrón de diseño tri-fuerza.