2011-09-08 53 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移动到包含中介代码的名称空间/程序集中。假设两者之间没有其他依赖关系。否则,将它们都移动到当前依赖的任何组件。