Composite Application Guidance for WPF(8)——事件2012-02-08 博客园 周银辉Prism的事件并没有直接使用C#的Event或WPF的RoutedEvent, 而是CompositeWpfEvent, 今天简单地谈一谈1, 为什么是全新打造的CompositeWpfEvent,而非C#的Event或WPF的RoutedEvent?原因一个: 断开事件发布者和事件订阅者之间的耦合.比如说模块A要订阅模块B的某一个时间,而模块A没有对模块B进行直接引用而是通用依赖注入等方式进行沟通的,所以在编译时无法进行事件的订阅.而对事件的发布和注册则是通过EventAggregator来统一管理的,其是订阅者和订阅者之间的桥梁,关于EventAggregator,稍后会谈到不过值得一提的是,CompositeWpfEvent更多地专注在模块之间的事件沟通,他并不是用来取代c#的Event和WPF的RoutedEvent的,他们在处于不同的层面上.2, EventAggregatorPrism采用了一个称为EventAggregator的聚合器来统一管理事件(CompositeWpfEvent).这实际上也是一种较常用的模式, 其思想比较简单,提供所有事件的实例:
/// <summary> /// 定义一个接口,其用于获取事件类型的实例 /// </summary> public interface IEventAggregator { /// <summary> /// 获取事件类型的一个实例 /// </summary> /// <typeparam name="TEventType">要获取实例的事件类型</typeparam> /// <returns>事件类型<typeparamref name="TEventType"/>的一个实例.</returns> [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter")] TEventType GetEvent<TEventType>() where TEventType : EventBase; }
所有的事件发布者和订阅者都从EventAggregator从去获取事件来进行发布和订阅, 发布者不关心订阅者是谁,订阅者也不关心发布者时谁,同一事件可以有着不同的发布者,同一事件也可以有多个订阅者,这形成了多对多的关系.但可能有人会问, 当我需要指定事件的发布者是谁时该怎么办呢, 就像普通事件中的Sender参数?很简单, 事件可以传递任意类型的TPlayload参数(相当于XXXEventArgs)关于EventAggregator模式,你可以参考这里http://martinfowler.com/eaaDev/EventAggregator.html在Prism中,EventAggregator作为一个基础服务添加到一容器中