您的位置:首页 > 其它

Prism 订阅事件 IEventAggregator 说明

2015-12-19 10:13 357 查看
本节学习了Event Aggregation事件聚合,这个在Prism中很重要,特别是对于Module间的通信。除了前面介绍的Command可以用于模块间的通信,还有我们这一节介绍的Event Aggregation(事件聚合).

(一)为什么不用.NET FrameWork中的事件呢?

使用.NET Framework事件是罪简单和直观的方式用于非松散耦合需求的组件,属于对象引用依赖的发布-订阅模型

(二) EventAggregator事件聚合器

提供了多点传送发布/订阅功能。这意味着可能有可以触发同一事件多个发布者和可以监听同一事件的订阅者。

(三)模块间通信过程简介

CompositePresentationEvent<TPayload>类实例实现了事件的订阅和取消,而IEventAggregator实例用来获取接收CompositePresentationEvent<TPayload>类实例.IEventAggregator实例在每个模块中含有,这样模块间就可以通信了。

(四)下面贴出Prism中Event Aggregation QuickStart的部分代码:

(1)创建了 CompositePresentationEvent<TPayload>类

在项目中EventAggregation.Infrastructure.Silverlight的FundAddedEvent.cs代码中,

public class ActivityPresenter
{
private string _customerId;
private IEventAggregator eventAggregator;
private SubscriptionToken subscriptionToken;

public ActivityPresenter(IEventAggregator eventAggregator)
{
this.eventAggregator = eventAggregator;
}

public void FundAddedEventHandler(FundOrder fundOrder)
{
Debug.Assert(View != null);
View.AddContent(fundOrder.TickerSymbol);
}

public bool FundOrderFilter(FundOrder fundOrder)
{
return fundOrder.CustomerId == _customerId;
}

public IActivityView View { get; set; }

public string CustomerId
{
get
{
return _customerId;
}

set
{
_customerId = value;

FundAddedEvent fundAddedEvent = eventAggregator.GetEvent<FundAddedEvent>();

if (subscriptionToken != null)
{
fundAddedEvent.Unsubscribe(subscriptionToken);
}
//订阅事件
//(1)获取事件聚合器实例
//(2)调用Subscribe方法
//   Subscribe方法重载,有不同的作用
//            Action<T>: 泛型委托
//            ThreadOption:当为PublisherThread时(默认值)能获取发布者线程
//                          BackgroundThread时 从.NET Framework线程池上异步获取事件
//                          UIThread时 获取事件从UI线程上。
//             keepSubscriberReferenceAlive: 当为true 事件实例是强引用订阅者,因此不能垃圾回收
//                                           当为false(默认值)弱引用订阅者,因此当没有其他引用时允许垃圾回收释放订阅者实例,当订阅者实例被回收,事件自动取消订阅
subscriptionToken = fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, false, FundOrderFilter);
//lamda表达式写法
//subscriptionToken = fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, false, FunOrder => FunOrder.CustomerId == this._customerId);
View.SetTitle(string.Format(CultureInfo.CurrentCulture, Resources.ActivityTitle, CustomerId));
}
}
}


View Code

(1)获取事件聚合器实例

(2)调用Subscribe方法
Subscribe方法重载,有不同的作用
Action<T>: 泛型委托
ThreadOption:

当为PublisherThread时(默认值)能获取发布者线程
BackgroundThread时 从.NET Framework线程池上异步获取事件
UIThread时 获取事件从UI线程上。
keepSubscriberReferenceAlive: 当为true 事件实例是强引用订阅者,因此不能垃圾回收
当为false(默认值)弱引用订阅者,因此当没有其他引用时允许垃圾回收释放订阅者实例,当订阅者实例被回收,事件自动取消订阅
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: