Маршрутизация события через несколько классов в C # - PullRequest
1 голос
/ 30 марта 2012

Распространенный сценарий, с которым мы сталкиваемся в нашем текущем приложении, - это то, где нам нужно направлять и проходить через несколько классов.

Вот пример класса heirarchy.

ActionManager MainWindow PresentationManager MenuManager Меню * 1005 кнопку MENU *

Меню подписывается на событие нажатия кнопки MenuButton. Затем он создает объект CustomAction и вызывает событие, которое подписано на MenuManager. В обработчике событий MenuManager он, в свою очередь, вызывает событие, на которое подписывается PresentationManager и т. Д.

Вот пример того, что реализовано для PresentationManager:

    void MenuManager_ActionGenerated(object sender, CustomActionEventArgs e)
    {
          if (ActionGenerated != null)
                ActionGenerated(sender, e);
    }

Я надеялся, что найдется способ поднять событие на уровне меню и получить его на уровне ActionManager.

Это плохая практика, что я сейчас делаю?

Ответы [ 4 ]

0 голосов
/ 30 марта 2012

Вы также можете заглянуть в агрегатор событий. Хороший пример можно найти в codeproject: Агрегатор событий со специализированными прослушивателями

0 голосов
/ 30 марта 2012

Я бы попробовал это CSharpMessenger Extended .

0 голосов
/ 30 марта 2012

Вы можете написать свои SubscriptionManager.

Упрощая можно Dicationary<string, List<Action<...>>>.Ключ - event-name, значение - List из Action с для запуска, даже если он был поднят.

Таким образом, все ваши компоненты подписываются на какое-то указанное событие, добавляя его Action<..> в список указанного события.

И когда выровняется четное (всегда через SubscriptionManager), все Action<..> s из списка будут выполнены.

Просто основная идея.Чтобы подготовить это производство, вам нужно написать немного больше.

Удачи.

0 голосов
/ 30 марта 2012

Если то, что вы перечислили как иерархию классов, на самом деле является вашим визуальным деревом, это звучит так, как будто вы описываете Маршрутизованные события.

http://msdn.microsoft.com/en-us/library/ms742806.aspx

Лично меня пугает большое количество событий.Если вы не будете осторожны с отпиской, они могут продлить срок службы ваших объектов.Кроме того, они могут вызвать сильную связь, уменьшая тестируемость.В некоторых случаях лучше использовать шаблон Commanding.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...