Prism学习笔记-模块之间通信的几种方式

在开发大型复杂系统时,我们通常会按功能将系统分成很多模块,这样模块就可以独立的并行开发、测试、部署、修改。使用Prism框架设计表现层时,我们也会遵循这个原则,按功能相关性将界面划分为多个模块,每个模块又包含多个Region。这就需要解决模块之间、Region之间经常需要进行通信的问题,Prism提供了以下几种方式:

1、聚合事件(Event aggregation

使用方式,先在一个公共模块中定义一个事件MyEvent ,传输数据为MyEntity。

public class MyEvent : CompositePresentationEvent<MyEntity>
{
}

然后在需要等待处理事件的模块中订阅事件,如下所示:

private IEventAggregator eventAggregator;

eventAggregator = (IEventAggregator)ServiceLocator.Current.GetService(typeof(IEventAggregator));

eventAggregator.GetEvent<MyEvent>().Subscribe(MyEventHandler, true);

public void MyEventHandler(MyEntity myEntity)
{

}

eventAggregator 相当于一个全局的集合,保存了所有订阅的事件。

在发起通信的模块中发布事件,如下所示:

eventAggregator.GetEvent<CreatePlanEvent>().Publish(new MyEntity());

2、全局命令

使用方式,在公共模块中定义一个全局命令类:

public static class GlobalCommands
{
        public static CompositeCommand OpenCommand = new CompositeCommand();

}

在使用该命令的View中:

<Button Command="{x:Static s:GlobalCommands.OpenCommand }" >

在响应该命令的模块中:

public ICommand OpenCommand { get; set; }

OpenCommand = new RelayCommand(param => this.Open(param));

GlobalCommands.OpenCommand.RegisterCommand(OpenCommand);

不用绑定时可以这样执行:

GlobalCommands.OpenCommand.Execute(param);

3、Region context

在Prism安装文件中自带的UIComposition例子中演示了两个Tab页共享一个数据集,

用法是在View中:

prism:RegionManager.RegionContext="{Binding CurrentEmployee}"

在两个Tab页的View的后台代码中:

RegionContext.GetObservableContext(this).PropertyChanged += (s, e)
                                                                        =>
                                                                        employeeDetailsViewModel.CurrentEmployee =
                                                                        RegionContext.GetObservableContext(this).Value
                                                                        as Employee;

我们还可以利用Region.Context属性共享数据,Region.Context中可以保存任何该Region需要与其他Region共享的数据。

因此我在实际使用时用Region.Context来保存一个控件对象的引用。如下所示:

在一个模块中保存

mainRegion.Context = new ContentControl();

在另一个模块中取出

IRegion mainRegion = regionManager.Regions["MainRegion"];
if (mainRegion == null) return;
ContentControlpane = mainRegion.Context as ContentControl;

因为regionManager是全局的,所以可以随时获得感兴趣的Region和Context

4、共享服务

这种方法我们在前面已经接触到了,如:

eventAggregator = (IEventAggregator)ServiceLocator.Current.GetService(typeof(IEventAggregator));

还可以,container= (IEventAggregator)ServiceLocator.Current.GetService(typeof(IUnityContainer));

IEventAggregator和IUnityContainer是Prism已有的服务,我们还可以自定义服务,请参考Prism自带的StockTrader RI例子

中的IMarketHistoryService服务。

时间: 2024-10-20 12:38:02

Prism学习笔记-模块之间通信的几种方式的相关文章

IPC进程之间通信的几种方式

概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件. 除此以外,那就是双方都可以访问的 外设 了.在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息.广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”.因为那些通信手段的效率

Android Service与Activity之间通信的几种方式

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍两种方式来实现Service与Activity之间的通信问题 通过Binder对象 当Activity通过调

Liferay7 BPM门户开发之33: Portlet之间通信的3种方式(session、IPC Render Parameter、IPC Event、Cookies)

文章介绍了5种方式,4种是比较常用的: Portlet session IPC Public Render Parameters IPC Event Cookies 参考地址: https://web.liferay.com/zh/community/wiki/-/wiki/Main/Portlet%E9%97%B4%E7%9A%84%E9%80%9A%E4%BF%A1 方式1:Session portlet session作用域: APPLICATION_SCOPE  :全局 PORTLET_

vue.js学习笔记(4)— 父子组件之间通信的第一种方式 props 和 $emit

我们知道,vue组件中,父组件把数组传递给子组件的话,通常是使用props传递,而vue规定,prop是只能单向下行传递的,那么子组件要怎么才能实现数据的向上传递呢,这里引述一个概念:"父子组件的关系:prop向下传递,事件向上传递",上一篇文章当中,关于数据向上传递用到的事件方法 $emit() 也进行了详细的说明,不懂的童鞋可以翻回去看一下.下面就是今天要说的父子组件相互通信的问题,点击效果依次如下: 代码如下: <!DOCTYPE html> <html>

Angular 学习笔记——模块之间的通讯

<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <script src="angular.min.js"></scrip

学习笔记之TCP/IP协议的传输方式

一.通过网络发送数据,大致可以分为面向有连接与面向无连接两种类型: 1.面向无连接型包括以太网. IP.UDP等协议. 2. 面向有连接 型包括ATM.帧中继.TCP等 协议. 通过一张图了解一下: 面向有连接型 面向有连接型中,在发送数据之前,需要在收发主机之间连接一条通信线路 面向有连接型就好比人们平常打电话,输入完对方电话号码拨出之后,只有 对端拿起电话才能真正通话,通话结束后将电话机扣上就如同切断电源.因此在 面向有连接的方式下,必须在通信传输前后,专门进行建立和断开连接的处理.如果与对

树莓派学习笔记——使用文件IO操作GPIO SysFs方式

0 前言 本文描述如果通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO输出或获得GPIO输入. Linux学习可从应用出发,先不纠结Linux驱动编写,先把Linux给玩起来. [相同与不同] 本文和[EasyARM

IOS开发笔记(2)页面之间传递数据几种方式比较

今天分享一下页面之间传值的几种方式 1.@property属性 这个不用多说了吧,当页面A 跳转到页面B,在class B中声明属性 @property (nonatomic, copy) NSString *name; 初始化B FirstViewController *firstVC = [FirstViewController new]; firstVC.name = @"name"; [self presentViewController:firstVC animated:YE

分布式通信的几种方式

RPC(remote produce calL) RPC是远程过程调用协议,它是基于C/S模型调用的机制,客户机向服务器端发 送调用请求等待服务器应答,是一种典型的请求应答机制,大致过程可以理解为本地分布式对象向本机发请求,不用自己编写底层通信本机会通过网络向服务器发送 请求,服务器对象接受参数后,经过处理再把处理后的结果发送回客户端. 它是早期的支持分布式一些,缺点rpc是面向过程的远程调用,不支持面向对象,所以现在用的人就少了. 不支持异步调用 RMI(remote method invoc