2011-09-08 9 views
6

Ho una domanda riguardante il modello di mediatore che voglio implementare nella mia applicazione (utilizzando C#). Durante l'implementazione del pattern nel mio codice mi sono imbattuto in una dipendenza circolare. La struttura delle classi come segue:Dipendenza circolare nel modello di mediatore utilizzando C#

Mediator e Colleague componenti/classi sono in diversi gruppi e come modello di mediazione richiede che entrambi i componenti (classi) si utilizzino l'un l'altro. Il problema sorge quando ci si riferisce l'un l'altro.

consideri il codice qui sotto

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}  

    } 
} 

come Mediater e collega sono in namespace diversi e assiemi, come risolvere la dipendenza circolare?

+1

Dipende dalle astrazioni, non dalle concrezioni. Mediatore e Collega possono trovarsi in assemblee separate, ma gli interfacci dovrebbero essere nel proprio assembly. – MattDavey

risposta

4

È necessario definire un terzo assieme che conterrà le interfacce. IMHO, non c'è altro modo.

2

Se due classi sono abbastanza strettamente accoppiate l'una all'altra per implementare un modello, perché sono in gruppi separati? Si noti che è possibile implementare il modello Mediator senza avere questo tipo di dipendenza circolare. In genere tale scopo, uno dei due modi:

  1. Registrazione callback delegato con il mediatore in modo che è possibile implementare il 'collega' in vari modi senza avere il mediatore bisogno di sapere su di loro. Questo è molto più semplice di un tempo, con metodi anonimi e espressioni lambda per esprimere in modo pulito la logica di callback.

  2. Fornire un'interfaccia standard IColleague nello stesso assieme del Mediatore con i callback necessari e definire qualsiasi implementazione concreta necessaria negli assembly consumanti.

1

Vorrei spostare l'IColleague nello spazio dei nomi/assieme contenente il codice del mediatore. Supponendo che non ci fosse altra dipendenza tra i due. Altrimenti spostali entrambi a seconda del gruppo su cui si sta attualmente lavorando.