本节学习了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. 如何查看FQDN

    FQDNFully Qualified Domain Name缩写, 含义完整域名. 例, 台机器主机名(hostname)www, 域缀(domain)example.com, 该主机FQDN应该w ...

  2. 第二篇.1、python基础之数据类型与变量

    一.变量 1 什么是变量之声明变量 #变量名=变量值 age=18 gender1='male' gender2='female' 2 为什么要有变量 变量作用:“变”=>变化,“量”=> ...

  3. ldap搭建

    yum install openldap openldap-servers openldap-clients -y #检查是否安装成功 slapd -VVopenldap的配置文件都在/etc/ope ...

  4. Codeforces Round #593 (Div. 2) D. Alice and the Doll

    题目:http://codeforces.com/problemset/problem/1236/D思路:机器人只能按照→↓←↑这个规律移动,所以在当前方向能够前进的最远处即为界限,到达最远处右转,并 ...

  5. mysql事务,视图,触发器,存储过程与备份

    .事务 通俗的说,事务指一组操作,要么都执行成功,要么都执行失败 思考: 我去银行给朋友汇款, 我卡上有1000元, 朋友卡上1000元, 我给朋友转账100元(无手续费), 如果,我的钱刚扣,而朋友 ...

  6. PowerDesigner 生成SQL Server 注释脚本

    --生成数据表的注释EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=[%R%?[N]]%.q:COMMENT% , @l ...

  7. wx小程序知识点(七)

    七.小程序提速与性能优化 参考大佬vicyao的文章 https://blog.csdn.net/wetest_tencent/article/details/61196522 (1)提高页面加载速度 ...

  8. 24. ClustrixDB 持久性配置文件

    这些持久性选项不适用于内存中的表.有关更多信息,请参见内存表. ClustrixDB提供了一个选项,通过指定如何提交事务并使其持久,从而提高性能.当提交成功通知应用程序时,用户可以在提交过程中指定提交 ...

  9. python中oepen及fileobject初步整理之划水篇

    open选项 参考官方文档,很多东西也没有看懂,将自己理解的部分先整理到这里,以后还是要参阅官方文档的. open (file, mode='r', buffering=-1, encoding=No ...

  10. 【GDSOI2019】滑稽二乘法【数据结构】【LCT】

    Description 点数<=100000,操作数<=200000 Solution 经典的LCT维护子树路径信息的问题. 具体来说,我们对于每一个节点,它在splay上的子树对应了原树 ...