C# winforms MVP应用程序中的自定义事件聚合器

C# winforms MVP应用程序中的自定义事件聚合器,c#,winforms,mvp,eventaggregator,C#,Winforms,Mvp,Eventaggregator,我决定为我正在编写的winforms MVP应用程序构建自己的事件聚合器。 其目的是允许视图(用户控件)从具有视图的模型订阅事件 问题是,;既然应该有一个通用的事件聚合器,并且只有在编写应该交互的用户控件应用程序时才需要聚合器,那么公开事件聚合器的最佳方式是什么 到目前为止,我的建议是: 我认为这将是一个混乱,因为所有用户控件都必须有一个IEventAggregator,聚合器对于用户控件本身来说不是必需的,只是主应用程序,它由具有附加功能的用户控件组成 将EventAggregator设置为静

我决定为我正在编写的winforms MVP应用程序构建自己的事件聚合器。 其目的是允许视图(用户控件)从具有视图的模型订阅事件

问题是,;既然应该有一个通用的事件聚合器,并且只有在编写应该交互的用户控件应用程序时才需要聚合器,那么公开事件聚合器的最佳方式是什么

到目前为止,我的建议是:

  • 我认为这将是一个混乱,因为所有用户控件都必须有一个IEventAggregator,聚合器对于用户控件本身来说不是必需的,只是主应用程序,它由具有附加功能的用户控件组成
  • 将EventAggregator设置为静态或单例。然而,这也会带来类似的问题,其中单个用户控件必须通过静态聚合器发布事件

  • 您有什么想法可以帮助我吗?

    我已经为这种场景实现了一个简单的EventBroker。然而,我不认为注射会一团糟。事实上,将其注入容器,然后解析为发布/订阅将是最简单的方法。也更容易进行单元测试。下面给出了我的事件代理(我使用的是MEF,但这几乎没有什么区别):-

    然后发布:-

            var broker = MefContainer.Instance.Resolve<MyEventBroker>();
            broker.Publish<MyCustomEventArgs >(new MyCustomEventArgs());
    
    var broker=MefContainer.Instance.Resolve();
    Publish(新的MyCustomEventArgs());
    
    并认购:-

                var broker = MefContainer.Instance.Resolve<MyEventBroker>();
                broker.Subscribe<MyCustomEventArgs >(t=>MyHandler(t));
    
    var broker=MefContainer.Instance.Resolve();
    Subscribe(t=>MyHandler(t));
    
    MefContainer是我的自定义单例类,用于公开合成容器。你可以使用统一,温莎或任何你喜欢的


    在这里写博客:

    你发现了吗?为什么你认为注射会一团糟?在没有聚合器模拟的情况下,如何测试控件聚合器交互?(在MVP中,控件本身在其ctor中保持无参数;它们有处理依赖关系的演示者)。我决定和Caliburn一起使用WPF,它内置了EA:)不错的选择。我曾与Caliburn.Micro合作过一些SL项目,这些项目都是Caliburn的优点,代码更少,如果您正在做任何与xaml相关的事情,那么值得一看。对于一般的仅EA实现,如果您熟悉Rx(反应式扩展)和IObservable,请查看
            var broker = MefContainer.Instance.Resolve<MyEventBroker>();
            broker.Publish<MyCustomEventArgs >(new MyCustomEventArgs());
    
                var broker = MefContainer.Instance.Resolve<MyEventBroker>();
                broker.Subscribe<MyCustomEventArgs >(t=>MyHandler(t));