Я знаю, что такое «обычный» шаблон проектирования посредника (некоторое описание есть в википедии: http://en.wikipedia.org/wiki/Mediator_pattern). В моем SOA у меня есть служба уведомлений: он должен передавать сообщения от одного сервиса всем другим, которые подписаны на этот конкретный сервис. Фактически, любой сервис может быть источником такого обмена сообщениями.
Мое видение такой реализации службы вызывает круговую зависимость между службами. Здесь ( Круговая зависимость в SOA )
Я спросил, как решить эту проблему, и получил совет использовать для этой цели шаблон «Посредник».
Если я правильно понимаю, у моей службы уведомлений должен быть контракт:
interface IMediator
{
void PublishMessage(IMessage message);
}
Служба должна реализовывать (размещать) этот интерфейс и предоставлять его как службу извне.
Любой подписчик должен:
- Реализация (хост) того же интерфейса на собственной стороне;
- Зарегистрируйтесь на стороне службы уведомлений.
На самом деле подписчики могут использовать интерфейс с другим значением, например:
interface IReceiver
{
void ProcessMessage(IMessage message);
}
В этом случае я вижу следующий поток сообщений:
- Любая служба будет вызывать IMediator.PublishMessage (сообщение) службы уведомлений;
- Служба уведомлений просканирует список подписчиков и вызовет IReceiver.ProcessMessage (message) для каждого подписчика.
Вопрос 1: все ли в порядке с таким дизайном?
Вопрос 2: Каким должен быть тип сообщения?
Сейчас мне нужно передать простую строку, поэтому одна из возможных реализаций может быть следующей:
interface IMessage
{
string MessageType{get;}
string MessageContent{get;}
}
Но здесь я вижу 2 проблемы:
- Я не думаю, что передача MessageType в виде строки - это хорошая идея;
- Мне не нравится кодировать сообщения любого типа в строку ....
Пожалуйста, сообщите. Любые мысли приветствуются!
P.S. Я планирую использовать сервис WCF в качестве базового движка для сервисов.
Отредактировано: после некоторых размышлений я вижу, что:
- для каждого типа сообщения требуется отдельный метод в IMediator;
- Для каждого типа сообщения требуется отдельный интерфейс Receiver.
С одной стороны - кажется разумным, с другой - большие накладные расходы ...