- Сложно и не удобно использовать. Нужно объявить событие, пометить его аттрибутом, потом сделать метод, который будет проверять на непустой список подписчиков и уже этот метод вызывать для генерации события.
- Отсутствие строгой типизации. Никто не мешает объявить подписку на событие с одной сигнатурой, а сгенерировать событие с другой.
- Неудобно отлаживать и разбираться в коде. Для того чтобы найти "подписчиков" и "публикаторов" события, приходится искать по строковому литералу.
- Неявная регистрация через рефлексию. А значит это не фатально, но медленнее чем могло бы быть.
public interface IListener<T> : IListener
{
void Handle(T message);
}
public interface IEventAggregator
{
void AddListener(IListener listener);
void RemoveListener(IListener listener);
void SendMessage<T>(T message);
void SendMessage<T>() where T : new();
}
После чего всё становится до неприличия простым:
class MultiListener : IListener<Message1>, IListener<Message2>
{
public MultiListener(IEventAggregator eventAggregator)
{
// This is sample code!
// Don't forget to unsubscribe in production code!
eventAggregator.AddListener(this);
}
public void Handle(Message1 message)
{
Console.WriteLine("Message1");
}
public void Handle(Message2 message)
{
Console.WriteLine("Message2");
}
}
Исходный код можно взять здесь.
P.S. А мне начинает нравиться coding style, когда приватные методы начинаются с lower case.
P.P.S. До конца не уверен, что это окончательный вариант с "синхронизированными" "подписчиками". Что если потоков много и я хочу получать свои сообщения в том же потоке, в котором я подписывался? Надо обдумать...
Комментариев нет:
Отправить комментарий