2010-08-17 29 views
6

que tiene dos conjuntos A & B.Referencia circular entre los dos ensamblados .NET

A ha referencia a B existentes y debe mantenerse de esa manera. En este momento hice algunos cambios a B que necesitan referirse a A. Entonces, se produce una referencia circular.

Bit de datos:

A tiene un par de rejillas de propiedad que el diálogo en B necesita ser acogido. Así que para evitar este problema de referencia circular intenté definir las interfaces con las cuadrículas en el tercer ensamblaje al que se refieren A & B y hacer que B solo haga referencia a las interfaces.

Dos cuestiones que estoy enfrentando:

  1. hay demasiada tipos de datos personalizados (propiedades para ser específico) dentro de las rejillas que se definen en el interior A y tengo que definir interfaces para cada uno de ellos.

  2. Veo un ejemplo de esto funciona con el parámetro de función, p. función objetivo llamada a través de la interfaz en el pasado, pero ¿cómo se ajuste teniendo en cuenta el siguiente código -. No puedo nuevo un ICustomPropertyGridWrapper ...

    object = new CustomPropertyGridWrapper(...)
    m_property.SelectedObject = object;

+0

Hace B ** ** requieren las clases de A, o es un más como un escenario de uso por defecto de la utilización de los tipos en B? Si están estrechamente unidos, no veo ninguna razón para mantenerlos en asambleas separadas. –

Respuesta

1

Para el problema 1, que no es realmente una solución distinta y luego fusionar los dos proyectos o hacer algo de código de generación

Para el segundo, se puede hacer que al implementar el patrón de diseño de fábrica.

0

refactorizar su código o fusionar asambleas = Don' t usa referencia circular Es síntoma de muy mal diseño.

+2

Duro juicio del diseño, teniendo en cuenta que usted no sabe casi nada al respecto, y no hay ningún consejo real ... No creo que esté siendo muy útil. – Kobi

+0

No lo hago, pero si verifica otras respuestas, están describiendo la misma solución: refactorizar o fusionar. Entonces es bastante útil. –

+4

Y es solo un síntoma de un mal diseño. Un buen diseño puede tener síntomas de malos diseños, si hay una justificación para ello, pero un buen diseñador seguirá prestando atención a esos síntomas y se asegurará de que realmente estén justificados, y de que se mantengan justificados a medida que cambian las cosas. –

3

Parece que está intentando morir por interfaz. No todo tiene que estar expuesto por la interfaz.

Una respuesta simple es fusionar los conjuntos, o mover los controles comunes y los tipos de datos a un tercer conjunto. Solo necesita interconectar cosas si desea una forma contractual consistente para acceder o trabajar con cosas, y desea ocultar la implementación real.

0

Si B depende ahora de bits de un tal vez debería refactor esos bits a cabo en un nuevo montaje de C que se hace referencia por tanto A como B.

3

Este es un problema con el diseño del lenguaje de C#. En C/C++ solo usaría un encabezado para definir la interfaz de la unidad de compilación y se resolvería la dependencia.

En C# no hay encabezados. Tiene tres opciones

  1. 1> fusionar los conjuntos (aumento del tiempo de compilación y no puede
    tienen sentido si las asambleas son funcionalmente no relacionados). C# a menudo te obliga a hacer esto, incluso si los ensamblajes lógicamente deberían estar separados.
  2. Dependencia de inyección
  3. Creación de un tercer conjunto con interfaces que ambos módulos hacen referencia.Esto lleva a cabo la inyección de dependencia a través de un mecanismo de lenguaje C# (interfaces), en lugar de implementar el suyo propio; pero es lo mismo.

Normalmente, el número 3 es cómo se manejan estas situaciones en C#, pero no es tan elegante como la solución de C/C++ para este problema. Para bases de códigos grandes, debe diseñar desde el principio con esto en mente.

+0

No veo cómo la inyección de dependencia podría ayudar aquí. Todavía tiene dos conjuntos que desean una referencia el uno al otro. – Vaccano

+0

Buen puntero sobre la limitación de C# de no tener un archivo de encabezado. Si es así, lo mismo se aplica a Java también. Sin embargo, no está claro cómo DI puede ayudar. Necesito una ilustración. – liang

Cuestiones relacionadas