Циркулярная зависимость в паттерне медиатора с использованием C#

У меня есть вопрос относительно шаблона посредника, который я хочу реализовать в своем приложении (используя C#). При реализации шаблона в моем коде я столкнулся с круговой зависимостью. Структура занятий следующая:

Mediator а также Colleague Компоненты / классы находятся в разных сборках, и в качестве шаблона-посредника оба компонента (классы) должны использовать друг друга. Проблема возникает при ссылках друг на друга.

Рассмотрим код ниже:

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 и коллега находятся в разных пространствах имен и сборок, как решить круговую зависимость?

3 ответа

Вам нужно определить третью сборку, которая будет содержать интерфейсы. ИМХО, другого пути нет.

Если два класса достаточно тесно связаны друг с другом для реализации шаблона, почему они находятся в отдельных сборках? Обратите внимание, что можно реализовать шаблон Mediator, не имея такой круговой зависимости. Обычно вы делаете это одним из двух способов:

  1. Зарегистрируйте обратные вызовы делегатов в Посреднике, чтобы вы могли реализовать своего "Коллегу" различными способами без необходимости, чтобы Посредник знал о них. Это намного проще, чем раньше, с анонимными методами и лямбда-выражениями для точного выражения логики обратного вызова.

  2. Предоставьте некоторый стандартный интерфейс IColleague в той же сборке, что и посредник, с необходимыми обратными вызовами и определите любую конкретную реализацию, которая вам нужна в потребляющих сборках.

Я бы переместил IColleague в пространство имен / сборку, содержащее код посредника. Предполагая, что между ними не было никакой другой зависимости. В противном случае перенесите их оба в зависимости от того, какая сборка в данный момент зависит.

Другие вопросы по тегам