Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c实现中介模式中的循环依赖#_C#_Design Patterns_Mediator - Fatal编程技术网

C# 使用c实现中介模式中的循环依赖#

C# 使用c实现中介模式中的循环依赖#,c#,design-patterns,mediator,C#,Design Patterns,Mediator,我想在我的应用程序中实现一个中介模式(使用C#)。在代码中实现该模式时,我遇到了一个循环依赖项。课程结构如下所示: Mediator和component组件/类位于不同的程序集中,因为中介模式要求两个组件(类)相互使用。相互引用时会出现问题 考虑以下代码: namespace Mediator { public abstract class IMediator { public IColleague colleague{get;set;} void Regis

我想在我的应用程序中实现一个中介模式(使用C#)。在代码中实现该模式时,我遇到了一个循环依赖项。课程结构如下所示:

Mediator
component
组件/类位于不同的程序集中,因为中介模式要求两个组件(类)相互使用。相互引用时会出现问题

考虑以下代码:

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}       
   }
 }


由于Mediater和同事位于不同的名称空间和程序集中,如何解决循环依赖关系?

您需要定义第三个程序集,该程序集将包含接口。嗯,没有别的办法了。

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

  • 向调解员注册代理回调,这样您就可以以各种方式实现“同事”,而无需调解员知道。这比以前简单得多,使用匿名方法和lambda表达式可以清晰地表达回调逻辑

  • 在与中介器相同的程序集中提供一些标准的“IColleague”接口,并提供必要的回调,并在使用程序集中定义所需的任何具体实现


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

    依赖于抽象,而不是具体。调解员和同事可以在单独的程序集中,但interfacas应该在自己的程序集中。
    namespace Colleague
    {
    
        public abstract class IColleague
        {
            IMediator mediator;
            void Send();
            void Recieve();       
    
        }
        public class ColleagueA:IColleague
        {
    
            void Send(){//code here}
            void Recieve(){//code here}       
    
        }
    }