2010-04-07 19 views
11

Nuestro proyecto actual se ha topado con un problema de dependencia circular. Nuestro ensamblaje de lógica de negocios utiliza clases y métodos estáticos de nuestro ensamblado SharedLibrary. SharedLibrary contiene un montón de funciones auxiliares, como una clase de SQL Reader, enumeradores, variables globales, manejo de errores, registro y validación.Solución de Dependencia Circular

SharedLibrary necesita acceso a los objetos Business, pero los objetos Business necesitan acceso a SharedLibrary. Los antiguos desarrolladores resolvieron este obvio olor a código al replicar la funcionalidad de los objetos comerciales en la biblioteca compartida (muy anti-DRY). He pasado un día tratando de leer sobre mis opciones para resolver esto, pero estoy llegando a un callejón sin salida.

Estoy abierto a la idea del rediseño de la arquitectura, pero solo como último recurso. Entonces, ¿cómo puedo tener una Biblioteca de Ayuda Compartida que pueda acceder a los objetos comerciales, con los objetos de negocio que todavía acceden a la Biblioteca de Ayuda Compartida?

+2

la pregunta obvia es: ¿Por qué necesita el acceso a los objetos de negocio la biblioteca compartida? Si puede responder eso, tendrá una solución. – Aaronaught

+0

SharedLibrary tiene una clase de variable global abstracta llena de propiedades estáticas. Estas propiedades se crean a partir de los valores de la base de datos, de ahí la necesidad de objetos comerciales, este es solo un ejemplo de muchos. Y, por supuesto, los objetos Business necesitan acceso a esas constantes. – gfoley

+2

Es por eso que nunca uso términos vagos como "compartido" para describir una biblioteca. ¿Qué es lo que hace? Lo que usted llama una biblioteca compartida claramente tiene demasiadas responsabilidades, y tal vez la biblioteca de objetos comerciales también lo haga. Típicamente, estas soluciones se resuelven poniendo las clases/interfaces verdaderamente * independientes * en su propia biblioteca. – Aaronaught

Respuesta

17

Puede crear un proyecto separado solo para objetos de valor (sin lógica) e interfaces.

en tus clases de bibliotecas compartidas implementan las interfaces, y la biblioteca de negocios dependen de las interfaces (qué escucho más comprobable y el código desacoplado aquí? Por no hablar de quitar la dependencia de la biblioteca compartida).

Idealmente, podría tener los objetos comerciales de los que su biblioteca compartida depende también de este proyecto adicional. Si los objetos comerciales son demasiado complejos, también puede transformarlos en interfaces.

Tendrá dos proyectos que no dependen el uno del otro, pero sólo en otro proyecto con sólo objetos "ficticios" (sin lógica):

negocios ---> Las interfaces y objetos de valor < --- biblioteca compartida

Ahora los están desacoplados =)

+0

Esta es la respuesta. – Strelok

+0

Si va a llegar tan lejos para diseñar la dependencia, ¿por qué detenerse a 5 pies de la línea de meta y no solo descartar todo? En ese momento, no tendría más código que dependa de las entidades comerciales y puede dejar el código verdaderamente compartido en el proyecto compartido. Cuál sería mi respuesta. –

+0

@Chris Eso no es un gran cambio. Eso requerirá algunas refactorizaciones, pero no un gran rediseño o la necesidad de remodelar cosas. –

0

Una solución sería poner un patrón de fachada en el medio. Aquí podría evitar el acceso directo/dependencia a sus objetos comerciales desde la biblioteca compartida. En cambio, estarías usando una capa que actúa como fachada entre tu lib y tus BOs. De esta forma, puedes empacar y desacoplar tus bibliotecas compartidas.

+1

Solo diría 'abstracción' sin especificar el nombre concreto del patrón (podría ser fácilmente un adaptador, estrategia, puente) porque el propósito principal de los patrones de diseño no es resolver problemas como este. –

3

Cada vez que tenga una biblioteca "compartida", absolutamente nunca debe hacer referencia al proyecto de su entidad comercial. Hacerlo provocará que este problema ocurra como es obvio.

La solución a esto es eliminar todo el código dependiente de la entidad comercial de la biblioteca compartida y rediseñar la necesidad de ese código auxiliar o colocar ese código auxiliar dentro del proyecto de la entidad comercial.

Cuestiones relacionadas