2011-09-08 86 views
6

我有一個關於調解器模式的問題,我想在我的應用程序中實現(使用C#)。在我的代碼中實現模式時,我遇到了循環依賴。這些類的結構如下:使用c調解器模式的循環依賴關係#

MediatorColleague組件/類在不同的程序集中,因爲中介模式需要兩個組件(類)相互使用。引用對方時出現問題。

考慮下面的代碼:

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}  

    } 
} 

爲Mediater和同事都在不同的命名空間和組件,如何解決循環依賴?

+1

取決於抽象,而不是結核。調解員和同事可以在單獨的集會中,但是interfacas應該在他們自己的集會中。 – MattDavey

回答

4

您需要定義第三個包含接口的程序集。恕我直言,沒有其他辦法。

2

如果兩個類相互緊密耦合以實現一個模式,爲什麼它們在單獨的程序集中?請注意,可以在不具有這種循環依賴關係的情況下實現中介模式。您通常通過兩種方式之一進行:

  1. 註冊與調解員代表回調,這樣就可以實現各種方式的「同事」,而無需中保需要了解他們。這比以前簡單得多,用匿名方法和lambda表達式來清晰地表達回調邏輯。

  2. 在與調解器相同的程序集中提供一些標準的「IColleague」接口和必要的回調函數,並在消費程序集中定義您需要的任何具體實現。

1

我會將IColleague移動到包含中介代碼的名稱空間/程序集中。假設兩者之間沒有其他依賴關係。否則,將它們都移動到當前依賴的任何組件。