功能间数据交互的编程方法

现在框架具有在两个打开的功能之间进行通讯的机制。通讯是指,一个功能调用另外一个功能的方法,或者传递一些数据,并得到返回结果。比如处置单打开结算单,结算单保存后,将结算单号反填到处置单上去。该机制通过委托实现两个功能之间方法的调用来通讯,支持同步和异步两种方式。框架隐藏了委托以及委托异步调用实现的复杂度。

一、实现机制示意图

两种调用方式:同步和异步。以下是两种调用的示意图。A为调用方,B为被调用方。也就是A功能调用B功能。

1,异步调用

2,  同步调用

二、编程

1,接收方(功能A),数据接收方,如处置单窗口

(1)        实现消息管道方法

从实现上讲,消息管道是接收方或者发送方类的一个方法。

消息管道方法实现数据的接收,包括

-          发送方主动发送过来的数据,或者

-          接收方对自己发送数据的处理结果的反馈数据。(异步模式下)

在消息管道方法里,对接收发送方发送过来的数据,进行处理,并返回处理结果。

管道方法的声明:

Object 方法名称( object sender, string messageId, object message )

Sender:一般是发送方的窗口对象。

messageId:消息唯一标识。正常发送的数据,消息标识为null。如果是接收方返回的数据,则是发送时的消息标识。发送方可以根据该消息标识做特定的处理。

message:发送过来的数据。

(2)        注册消息管道方法到EAFC

注册消息管道,返回管道ID:

Xsoft.UI.MessageChannelDelegete     revDelegate = null;

revDelegate = new     MessageChannelDelegete(this.MessageChannel);

string myChannelID     = Xsoft.UI.EafcApp.RegistMessageChannelDelegate(revDelegate,  this);

注册myChannelID要传给功能B,在打开功能B的时候要用到。

注意:在窗口退出的时候,要记得取消注册:

Xsoft.UI.EafcApp.UnregistMessageChannelDelegate(myChannelID )

(3)        打开数据发送方(功能B)

Xsoft.UI.FunctionMgr.FunctionCall("9981", null, this.Handle, FormOpenMode.RESPONSE, myChannelID);

注意:如果用FormOpenMode.RESPONSE(对话框)打开的话,被打开的功能依然显示在一个标签页中,但是只有被打开的功能(9981功能)关闭后,打开9981功能的窗口才可以关闭。并且使用这种打开方式时,一定要传当前窗口的句柄:this.Handle

2,发送方(功能B),数据发送方,如结算单窗口

(1)        注册消息管道方法到EAFC,并实现之。

在异步调用模式下,管道方法也用来接收数据接收方返回的数据。

注意:发送方的消息管道方法不是必须的,如果使用同步调用,或者虽然使用异步模式但不需要接收数据接收方的返回数据时,不需要注册管道方法。

(2)        获得数据接收方的接收管道ID:RecChannelID。

接收管道ID在发送时要使用。

数据接收方的接收管道ID是由接收方在调用(打开)发送方时,传递给数据发送方的。

在Load方法中:

XmlDocument doc = new XmlDocument();

doc.LoadXml("<arg>"     + this.Tag.ToString() + "</arg>");

XmlNode root = doc.DocumentElement;

XmlNode arg = doc.DocumentElement.FirstChild;

while (arg != null)

{

switch     (arg.Name)

{

case     "MessageReceiver":

RecChannelID= arg.InnerXml;

break;

default:

break;

}

arg = arg.NextSibling;

}

(3)        发送数据到数据接收方:功能A

同步发送

this.textBox1.Text = EafcApp.TransferMessage(RecChannelID, this, this.textBox1.Text) as string;

异步发送

string msgId = Guid.NewGuid().ToString();

EafcApp.AsyncTransferMessage(RecChannelID, myChannelID, this, msgId, data);

MsgId数据发送时的消息ID,在异步方式下返回信息时,也会传回来,通过它,将回应消息与发送信息进行匹配。

最新文章

  1. IIS部署遇到的一些问题
  2. C# 网络与Cmd命令
  3. NPAPI开发常识
  4. linux下socket编程-TCP
  5. 加密传输SSL协议2_传统加密
  6. Css Rest 方法
  7. mvc模式jsp+servel+dbutils oracle基本增删改查demo
  8. Vue跨门槛系列之实例的阐述
  9. java将对象转map,map转对象工具类
  10. Python基础:五、Python程序的编写方式
  11. IDEA 控制台乱码问题
  12. contains用法
  13. CF954F Runner&#39;s Problem(DP+矩阵快速幂优化)
  14. [Python]mysql-python 安装错误 fatal error C1083: Cannot open include file: &#39;config-win.h&#39;: No such file or directory
  15. PowerBI新功能: PowerBI多报表共享一个数据集
  16. scope 前缀开头的方法
  17. C++ code:More Loop Designs
  18. elast alert
  19. Zookeeper面试题
  20. 9.DataGrid数据表格

热门文章

  1. Android高斯模糊
  2. android 支持分组和联系人展示的一个小样例
  3. 变脸不变质的桥梁模式(Bridge Pattern)
  4. python 函数之walk
  5. CBV进阶(一)
  6. MongoDB入门(1)--安装配置
  7. clear伪类使用
  8. js求指定时间的周一和周日
  9. Datamatrix码
  10. 实用推荐:12款Linux系统恢复工具