本节学习了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代码中,

//定义CompositePresentationEvent<TPayload>类
//(1)该类是泛型类:强制发布者和订阅者要一种正确的类型实现 发布-订阅连接
//(2)是唯一继承自EventBase的类
//(3)因为CompositePresentationEvent<TPayload>往往被多个模块公用,所以要单独于
// 其他的模块新建类库项目
//FundOrder是这里的TPayLoad类型
public class FundAddedEvent : CompositePresentationEvent<FundOrder>
{
}

(2)事件的发布

在ModuleA.Silverlight项目中的

public class AddFundPresenter
{
private IAddFundView _view;
//IEventAggregator 事件聚合器接口
private IEventAggregator eventAggregator; public AddFundPresenter(IEventAggregator eventAggregator)
{
this.eventAggregator = eventAggregator;
} //事件发布:当用户添加一个fund基金,事件就被发布
//发布者发布一个事件
//(1)通过IEventAggregator的实例eventAggregator的Publish方法
//(2)指定GetEvent<TEventType>中TEventType为FunAddedEvent
void AddFund(object sender, EventArgs e)
{
FundOrder fundOrder = new FundOrder();
fundOrder.CustomerId = View.Customer;
fundOrder.TickerSymbol = View.Fund; if (!string.IsNullOrEmpty(fundOrder.CustomerId) && !string.IsNullOrEmpty(fundOrder.TickerSymbol))
eventAggregator.GetEvent<FundAddedEvent>().Publish(fundOrder);
} public IAddFundView View
{
get { return _view; }
set
{
_view = value;
_view.AddFund += AddFund;
}
} }

(3)事件的订阅

在ModuleB.Silverlight项目中的ActivityPresenter.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));
}
}
}

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

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

当为PublisherThread时(默认值)能获取发布者线程
BackgroundThread时 从.NET Framework线程池上异步获取事件
UIThread时 获取事件从UI线程上。
keepSubscriberReferenceAlive: 当为true 事件实例是强引用订阅者,因此不能垃圾回收
当为false(默认值)弱引用订阅者,因此当没有其他引用时允许垃圾回收释放订阅者实例,当订阅者实例被回收,事件自动取消订阅

Prism 订阅事件 IEventAggregator 说明的更多相关文章

  1. 中控考勤仪IFace302多线程操作时无法订阅事件

    场景: 在各办事点安装中控考勤仪Iface302,各办事点的工作人员上下班报到时使用指纹或面纹进行自动登记,验证成功后将与服务吕进行通讯记录相关的考勤信息. 条件限制: 由于Iface302设备不支持 ...

  2. 微信公众平台开发(三) 订阅事件(subscribe)处理

    一.简介 新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,默认代码中没有对这一事件进行相应回复处理. 在新用户关注公众平台后,可能想知道该平台提供了哪些功能,以及怎样使用该平台, ...

  3. 微信公众平台开发3:订阅事件subscribe处理

    新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,默认代码中没有对这一事件进行相应处理. 在新用户关注公众平台后,可能想知道该平台提供了哪些功能,以及怎样使用该平台,通俗一点讲就是 ...

  4. C#winform使用+=和-=订阅事件和移除事件订阅

    1.C#winform中使用+=和-=订阅事件和移除事件订阅 2.可以使用+=给一个控件订阅多个事件,触发事件时按顺序执行,直到使用-=移除事件订阅为止.

  5. [No0000130]WPF 4.5使用标记扩展订阅事件

    自从我上次写到关于标记扩展的时候已经有一段时间了...... Visual Studio 11 Developer Preview的发布给WPF带来了一些新功能,让我有理由再次使用它们.我要在这里讨论 ...

  6. Android 使用RxJava实现一个发布/订阅事件总线

    1.简单介绍 1.1.发布/订阅事件主要用于网络请求的回调. 事件总线可以使Android各组件之间的通信变得简单,而且可以解耦. 其实RxJava实现事件总线和EventBus比较类似,他们都依据与 ...

  7. 如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI

    原文:如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI 由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被 ...

  8. Prism.WPF -- Prism框架使用(下)

    本文参考Prism官方示例 命令使用 Prism提供了两种命令:DelegateCommand和CompositeCommand. DelegateCommand DelegateCommand封装了 ...

  9. Prism的IEventAggregator事件聚合器, 事件订阅发布, ViewModel之间的通讯

    WPF中时常会遇到ViewModel之间的通讯,ViewModel并不知道自己的View,但是一个View发生的更改需要通知另外一个View. 举一个例子,软件界面上有个人信息,打开一个界面更改用户的 ...

随机推荐

  1. 为Qtcreator 编译的程序添加管理员权限

    (1)创建资源文件 myapp.rc 1 24 uac.manifest (2)创建文件uac.manifest <?xml version="1.0" encoding=& ...

  2. 标准C语言(5)

    无法预知的数字叫随机数,rand标准函数可以用来获得随机数,为了使用这个标准函数需要包含stdlib.h头文件 srand标准函数用来设置随机数种子,这个函数把一个整数作为种子使用不同的种子可以得到不 ...

  3. plsql之导入数据乱码

     问题现象: 首先是使用了plsql 8.0版本客户端导入 ANSI as UTF-8 的字符集 格式sql 文件进行数据的导入, 然后检查了所有的系统环境的字符集和plsql 的字符集 都OK 的但 ...

  4. svn提交报错 解决方法

    1.先clean 2.删除 .lock文件 3.update项目 4.先还原文件,然后update 接着commit

  5. CI/CD----jenkins+gitlab+django(内网)

    1.py第三方包获取 ./pip3 ./pip3 -i "http://pypi.douban.com/simple/" --trusted-host pypi.douban.co ...

  6. 高性能mysql 附录D explain执行计划详解

    EXPLAIN: extended关键字:在explain后使用extended关键字,可以显示filtered列和warning信息.在较旧的MySQL版本中,扩展信息是使用EXPLAIN EXTE ...

  7. 服务端获取参数(koa)

    1.获取query(问号后面的内容) ctx.query 2.获取路由参数(如'/user/:id'的id) ctx.param 3.获取body请求体 koa不能直接获取请求体里的body,需要安装 ...

  8. Java多线程和并发(九),ReentrantLock(公平锁)

    目录 1.ReentrantLock 2.ReentrantLock的实现 3.synchronized和ReentrantLock的区别 九.ReentrantLock(公平锁) 1.Reentra ...

  9. Linux任务计划及周期性任务执行:at、crontab命令

    一.概述 未来的某时间点执行一次某任务:at, batch 周期性运行某任务:crontab 这两个任务的执行结果:会通过邮件发送给用户 (本地终端用户之间的邮件通知) centos 5,6,7默认开 ...

  10. [BZOJ5249][九省联考2018]IIIDX:线段树+贪心

    分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解. 字典序最大有另一种理解方式,就是让越小的数尽量越靠后. 我们从树的根结点出发,从1开始填数,构造出 ...