Шаблон EventAggregator (он же EventPublisher, он же EventBroker) известен давно, и описан Фаулером еще в 2004 году. Обобщённую реализацию для .NET можно найти в серии Build your own CAB под пунктом 13а. Основная идея проста: за счёт единообразной диспетчеризации сообщений упрощается код клиентского класса, уменьшается число его зависимостей.
В интернете можно найти много и других реализаций. Так собственно, зачем городить еще одну? Ответ прост: хочется получить более мощные возможности по модификации поведения, и естественно, получить полный контроль над проектом (как первый этап плана по захвату мира).
Обычно IPublisher включает методы подписки/отписки получателей сообщений. Но это неправильно: многим классам надо только отправлять сообщение. Поэтому вооружимся ISP, и выделим подписку в отдельный интерфейс:
И конечно же, осталось ввести интерфейс для подписчиков:
Скелет будущего диспетчера событий готов. В следующих частях серии займемся его реализацией.
Код проекта на есть Github.
В интернете можно найти много и других реализаций. Так собственно, зачем городить еще одну? Ответ прост: хочется получить более мощные возможности по модификации поведения, и естественно, получить полный контроль над проектом (как первый этап плана по захвату мира).
public interface IPublisher
{
void Publish<TMessage>(TMessage "message");
}Обычно IPublisher включает методы подписки/отписки получателей сообщений. Но это неправильно: многим классам надо только отправлять сообщение. Поэтому вооружимся ISP, и выделим подписку в отдельный интерфейс:
public interface IAssignee : IListenerSource
{
void Subscribe(object listener);
void Unsubscribe(object listener);
}И конечно же, осталось ввести интерфейс для подписчиков:
public interface IListener<TMessage>
{
void ListenTo(TMessage message);
}Обобщённая версия интерфейса подписчика даёт большое преимущество: статическую типизацию получателей сообщений по типу сообщения. Скелет будущего диспетчера событий готов. В следующих частях серии займемся его реализацией.
Код проекта на есть Github.
Комментариев нет:
Отправить комментарий