Циркулярная зависимость в паттерне медиатора с использованием c # - PullRequest
6 голосов
/ 08 сентября 2011

У меня есть вопрос относительно шаблона посредника, который я хочу реализовать в своем приложении (используя 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 ]

4 голосов
/ 08 сентября 2011

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

2 голосов
/ 08 сентября 2011

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

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

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

1 голос
/ 08 сентября 2011

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

...