在C#中通过多个类路由事件

时间:2012-03-30 17:48:57

标签: c# events routing

我们当前应用程序遇到的一个常见场景是我们需要通过多个类路由和事件。

这是一个样本类heirarchy。

ActionManager 主窗口 PresentationManager MenuManager 菜单 菜单按钮

菜单订阅MenuButton的click事件。然后,它创建一个CustomAction对象并引发一个订阅了MenuManager的事件。在MenuManager事件处理程序中,它依次引发由PresentationManager订阅的事件,依此类推。

以下是PresentationManager实现的示例:

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

我希望有一种方法可以在菜单级别提升事件并在ActionManager级别接收它。

我目前正在做的不好吗?

4 个答案:

答案 0 :(得分:0)

如果您列出的类层次结构实际上是您的可视树,则听起来就像您描述的是路由事件。

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

就个人而言,我被很多事件吓到了。如果您不小心取消订阅,它们可以延长对象的生命周期。此外,它们可能会导致紧耦合,从而降低可测试性。在某些情况下,使用命令模式是一种更好的方法。

答案 1 :(得分:0)

我会尝试这个CSharpMessenger Extended

答案 2 :(得分:0)

您可以自己编写SubscriptionManager

通过简化可以是Dicationary<string, List<Action<...>>>。 关键是event-name,值是List的{​​{1}}来运行甚至被提出的文件。

因此,所有yuor组件通过将其Action添加到指定事件列表来订阅某个指定事件。

当偶数引发(总是通过Action<..>)列表中的所有SubscriptionManager时,将执行。

只是一个基本想法。为了使这个生产准备就绪,你需要编写更多的代码。

祝你好运。

答案 3 :(得分:0)

您还可以查看Event Aggregator。可以在codeproject找到一个很好的例子:Event Aggregator with Specialized Listeners