Циркулярная зависимость в паттерне медиатора с использованием 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, не имея такой круговой зависимости. Обычно вы делаете это одним из двух способов:
Зарегистрируйте обратные вызовы делегатов в Посреднике, чтобы вы могли реализовать своего "Коллегу" различными способами без необходимости, чтобы Посредник знал о них. Это намного проще, чем раньше, с анонимными методами и лямбда-выражениями для точного выражения логики обратного вызова.
Предоставьте некоторый стандартный интерфейс IColleague в той же сборке, что и посредник, с необходимыми обратными вызовами и определите любую конкретную реализацию, которая вам нужна в потребляющих сборках.
Я бы переместил IColleague в пространство имен / сборку, содержащее код посредника. Предполагая, что между ними не было никакой другой зависимости. В противном случае перенесите их оба в зависимости от того, какая сборка в данный момент зависит.