Event Aggregation(事件聚集)
Prism类库提供了事件机制能让应用程序中的组件相互通信。这种机制建立在事件聚合(event aggregate)服务上,允许发布者和订阅者通过事件通信,不许要彼此直接引
用。
EventAggregator提供了多点传送发布/订阅功能。这意味着可能有可以触发同一事件多个发布者和可以监听同一事件的订阅者。考虑使用EventAggregator 来发布一个事
件,贯穿多个模块和发送消息在业务逻辑代码间,像控制器和展示。
在Stock Trader RI,关于这个的一个例子就是,当Process Order 按钮别点击而且订单被成功处理,如痴同时,其他模块需要知道订单被成功处理,以便它们能更新它们的
视图。
Prism类库创建的事件是类型事件。这意味着你能在运行应用程序之前通过编译时(compile-time)类型的优点探测是否错误,在Prism列哭中,EventAggregator允许订阅者
或发布者设置一种特殊的EventBase.事件聚集允许多个发布者和多个订阅者。正如下面的插图。
注意:
关于.NET Framework 事件
使用.NET Framework事件是罪简单和直观的方式用于非松散耦合需求的组件。.NET Framework 事件实现了发布-订阅模式,但是是对一个对象订阅,你需要直接引用那个对象,
这个在复杂的应用程序中,通常属于另一模块。后果是一种紧耦合设计。因此,.NET Framework事件用于模块内的通信替代模块间的通信。如果你使用.NET Framework 事件,
你不得不非常小心内存泄露,特别是如果你有一个非静态的或者短暂的组件订阅了一静态长久的事件。如果你没有取消订阅的订阅者,那将被保存有效通过订阅者,而且阻止前者
被垃圾回收。
IEventAggregator
EventAggregator类被作为服务在容器里且可以被获取通过IEventAggregator接口,事件聚合器复杂设置或构建事件来保持一个事件集合在系统中。
public interface IEventAggregator
{
TEventType GetEvent<TEventType>() where TEventType : EventBase;
}
{
TEventType GetEvent<TEventType>() where TEventType : EventBase;
}
EventAggregator构造事件在它第一次访问的时候,如果它没有构造事件。这个解除了发布者和订阅者需要决定是否事件是否有效。
CompositePressentationEvent
真正起作用关联发布者和订阅者是通过CompositePressentationEvent 类,在Prism类库中,它是唯一实现EventBase类的。这个类维护着
订阅者列表和分配到这些订阅者的事件句柄。
CompositePressentationEvent类是一个泛型类,他需要payload类型被定义为泛型类型,这能帮助发布者和订阅者在编译时以一种正确的方
法用来成功的事件相连。如下代码显示了CompositePresstationEvent类部分定义。
public class CompositePresentationEvent<TPayload> : EventBase
{
...
public SubscriptionToken Subscribe(Action<TPayload> action);
public SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption);
public SubscriptionToken Subscribe(Action<TPayload> action, bool keepSubscriberReferenceAlive)
public virtual SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption, bool keepSubscriberReferenceAlive);
public virtual SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption, bool keepSubscriberReferenceAlive, Predicate<TPayload> filter);
public virtual void Publish(TPayload payload);
public virtual void Unsubscribe(Action<TPayload> subscriber);
public virtual bool Contains(Action<TPayload> subscriber)
...
}
{
...
public SubscriptionToken Subscribe(Action<TPayload> action);
public SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption);
public SubscriptionToken Subscribe(Action<TPayload> action, bool keepSubscriberReferenceAlive)
public virtual SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption, bool keepSubscriberReferenceAlive);
public virtual SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption, bool keepSubscriberReferenceAlive, Predicate<TPayload> filter);
public virtual void Publish(TPayload payload);
public virtual void Unsubscribe(Action<TPayload> subscriber);
public virtual bool Contains(Action<TPayload> subscriber)
...
}
创建事件和发布事件
下面的部分描述了怎样通过使用IEventAggregator接口创建、发布、订阅CompositePressentationEvent
创建一个事件
发布一个事件
订阅多个事件