【问题标题】:Circular Dependency in mediator pattern using c#使用 c# 的中介模式中的循环依赖
【发布时间】:2011-11-13 02:53:50
【问题描述】:

我有一个关于我想在我的应用程序中实现的中介模式的问题(使用 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和同事在不同的命名空间和程序集中,如何解决循环依赖?

【问题讨论】:

  • 依赖于抽象,而不是具体化。 Mediator 和 Colleague 可以在单独的程序集中,但接口应该在它们自己的程序集中。

标签: c# design-patterns mediator


【解决方案1】:

您需要定义将包含接口的第三个程序集。恕我直言,没有其他办法。

【讨论】:

    【解决方案2】:

    如果两个类为了实现一个模式而彼此紧密耦合,为什么它们在单独的程序集中?请注意,可以在没有这种循环依赖的情况下实现 Mediator 模式。您通常通过以下两种方式之一执行此操作:

    1. 向 Mediator 注册委托回调,以便您可以通过各种方式实现您的“同事”,而无需让 Mediator 了解它们。这比以前简单多了,使用匿名方法和 lambda 表达式来清晰地表达回调逻辑。

    2. 在与中介者相同的程序集中提供一些标准的“IColleague”接口以及必要的回调,并在消费程序集中定义您需要的任何具体实现。

    【讨论】:

      【解决方案3】:

      我会将 IColleague 移动到包含中介代码的名称空间/程序集中。假设两者之间没有其他依赖关系。否则将它们都移动到当前依赖的任何程序集。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-30
        • 2012-07-01
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        • 1970-01-01
        • 2021-09-17
        • 2021-09-18
        相关资源
        最近更新 更多