2011-12-19 14 views
5

He estado trabajando en un proyecto y, a medida que crece, me doy cuenta de que dos partes que no se pueden unir entre sí son interdependientes.csc.exe y conjuntos dependientes

Llamemos estas dos partes a.exe y b.dll. b.dll proporciona una implementación que permite que a.exe recupere datos, pero quiero que sea su propio ensamblaje independiente para que se pueda cambiar fácilmente y hacer que a.exe se comunique con diferentes fuentes de datos.

Sin embargo, mientras que se requiere a.exe para hacer referencia a b.dll, b.dll requiere varias funciones que son una parte inseparable de a.exe.

Desde que estoy compilando - para probar - mientras escribía este proyecto, existen a.exe y b.dll, y puedo compilar b.dll contra a.exe y a.exe contra b.dll, pero ¿cómo/podría alguna vez reconstruir ambos desde la fuente?

+0

¿Cómo no ha obtenido un error de dependencia circular de Visual Studio? – Oded

+0

@Oded Está usando la compilación de línea de comandos, puedes construir iterativamente esto y crear dependencias circulares, pero lo hace para que nunca puedas hacer una reconstrucción limpia (sin dificultad extrema). –

+0

@ReedCopsey - Pensé que podría estar haciendo eso, pero quería confirmación de OP. Como dijiste, una construcción limpia es imposible en este escenario. – Oded

Respuesta

2

Invoke csc.exe, compilar la fuente para a.exe y B.dll en a.exe, invoque csc.exe, co mpile la fuente de b.dll en b.dll y haga referencia a a.exe, y luego invoque csc.exe por última vez, compile el origen de a.exe en a.exe y haga referencia a b.dll.

4

En general, sería una buena idea refactorizar esto y mover las dependencias compartidas a su propio ensamblado (c.dll). De esta forma, tanto a.exe como b.dll podrían hacer referencia a c.dll, y usted evitaría esta dependencia circular.

+0

Si lo hice, en esta situación, solo puedo imaginarme que c.dll dependería de a.exe y b.dll. La funcionalidad no se puede separar correctamente del código en b.dll y a.exe. –

+1

@RobertAllanHenniganLeahy Tu objetivo debe ser separar esto. Intenta diseñar tu API para que esté desacoplada. No hay ninguna razón para que los tipos sean todos interdependientes. Siempre se puede definir una interfaz en c.dll que a.exe o b.dll implementa para proporcionar funcionalidad, o usar delegados, etc. Las dependencias circulares como esta siempre se pueden trabajar alrededor ... –

+0

Supongo que no veo el Es necesario evitar la interdependencia solo por el hecho de evitarla, especialmente cuando los métodos que sugiere aumentan potencialmente la complejidad y el tamaño y potencialmente disminuyen el rendimiento. Sin embargo, pensé que era fácil superar este problema: invocar csc.exe, compilar el origen de a.exe y b.dll en a.exe, invocar csc.exe, compilar el origen de b.dll en b.dll y hacer referencia a a.exe, y luego invocar csc.exe por última vez, compile la fuente de a.exe en a.exe y haga referencia a b.dll. –

5

Me refactorizar su sistema en tres conjuntos:

  • a.exe - Antiguo EXE nada debe hacer referencia a este
  • B.dll - Como lo tienes hoy, pero no hace referencia a a.exe, hace referencia a c.dll
  • c.dll - Este debe contener las piezas comunes/piezas que tanto a como b necesitan para hacer referencia a
+0

b.dll solo contiene una clase, llamémosla DataSource, y a.exe contiene una biblioteca de clases, pero la única que necesita b.dll es la clase llamada Servidor, que es el componente principal de a.exe. . –

Cuestiones relacionadas