Могу ли я реализовать в своём контроллере событие? Где я должен буду подписать другой/другие контролеры на это событие? Противоречит ли это самому шаблону?
Ответ
Все контроллеры внутри приложения унаследовать от ControllerBase класса, внутри него создать статический dispatcher, невидимый в классах наследниках, наружу оставить видимые методы для подписки и отписки слушателей + отправка событий.
пример кода, отсюда, очень советую почитать
код не проверялся, используйте как набросок
class ControllerBase
{
public delegate void AlarmEventHandler(object sender, EventArgs e);
public static event AlarmEventHandler Alarm;
public void addEventListener(EventListenerClass c)
{
AlarmEventHandler aeh = new AlarmEventHandler(c.eventListenerMethod);
saveAlarmEventHandler(aeh); // Save
Alarm += aeh;
}
public void removeEventListener(EventListenerClass c)
{
AlarmEventHandler aeh = getAlarmEventHandler(c.eventListenerMethod); // Get
Alarm -= aeh;
}
public void OnEvent(AlarmEventArgs e)
{
AlarmEventHandler handler = Alarm;
if (handler != null)
{
// Invokes the delegates.
handler(this, e);
}
}
}
помните, если контроллер динамический, то он должен сам "чистить" слушатели при удалении
и еще, то что все контроллеры "видят" глобальные события, есть очень не гуд, можно долго рассказывать, но это существенный подводный камень, как вариант делают некий глобальный контекст который сам диспетчеризует все события и дает их видеть только нужным контроллерам
Комментариев нет:
Отправить комментарий