2011-09-08 22 views
6

Tengo una pregunta sobre el patrón del mediador que quiero implementar en mi aplicación (usando C#). Mientras implementaba el patrón en mi código, encontré una dependencia circular. La estructura de las clases de la siguiente manera:Dependencia circular en el patrón del mediador usando C#

Mediator y Colleague los componentes/clases están en diferentes conjuntos y como patrón de mediador requiere que ambos componentes (clases) se usen entre sí. El problema surge al hacer referencia el uno al otro.

Considérese a continuación el código:

namespace Mediator 
{ 
    public abstract class IMediator 
    { 
     public IColleague colleague{get;set;} 
     void Register(); 
     void Send();   
    } 
    public class MediatorA:IMediator 
    {   
    void Register(){//code here} 
    void Send(){//code here}  
    } 
} 

namespace Colleague 
{ 

    public abstract class IColleague 
    { 
     IMediator mediator; 
     void Send(); 
     void Recieve();  

    } 
    public class ColleagueA:IColleague 
    { 

     void Send(){//code here} 
     void Recieve(){//code here}  

    } 
} 

como Mediater y colega se encuentran en diferentes espacios de nombres y ensamblados, la forma de resolver la dependencia circular?

+1

Depende de las abstracciones, no de las concreciones. El mediador y el colega pueden estar en conjuntos separados, pero las interfaces deben estar en su propio conjunto. – MattDavey

Respuesta

4

Debe definir un tercer conjunto que contendrá las interfaces. En mi humilde opinión, no hay otra manera.

2

Si dos clases están bastante bien acopladas entre sí para implementar un patrón, ¿por qué están en ensamblajes separados? Tenga en cuenta que es posible implementar el patrón Mediator sin tener este tipo de dependencia circular. Normalmente, esto por una de dos maneras:

  1. Registro de devoluciones de llamada de delegado con el mediador para que pueda poner en práctica su 'colega' de varias maneras sin tener el mediador necesita saber acerca de ellos. Esto es mucho más simple de lo que solía ser, con métodos anónimos y expresiones lambda para expresar limpiamente la lógica de devolución de llamada.

  2. Proporcione una interfaz estándar 'IColleague' en el mismo ensamblaje que el Mediator con las devoluciones de llamada necesarias y defina la implementación concreta que necesite en los ensamblados consumidores.

1

Me gustaría mover el IColleague en el espacio de nombres/montaje que contiene el código del mediador. Asumiendo que no había otra dependencia entre los dos. De lo contrario, muévalos a cualquiera de los ensambles de los que se depende actualmente.

Cuestiones relacionadas