65.9K
CodeProject 正在变化。 阅读更多。
Home

Web 服务 DataWindows

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2011 年 10 月 20 日

CPOL

6分钟阅读

viewsIcon

15643

来自实地的 Web 服务 DataWindows 技巧和窍门

自 9.0 版本以来,PowerBuilder 就提供了通过 Web 服务接口技术创建运行在面向服务架构应用程序中的前端客户端的能力。最初,该功能基于开源的 EasySOAP 驱动程序。在 10.5 版本中,它扩展到使用 .NET 2.0 兼容驱动程序,而在 12.0 版本中,.NET SOA 接口已与最新的 MS WCF 技术兼容。此外,在 11.0 版本中,可以从 Web 服务数据源定义创建 DataWindow 对象。最近,我使用 PB 12.0 创建了四个 SOA 客户端版本:经典 Win32、.NET WebForm、.NET WinForm 和 WPF .NET。所有业务逻辑和数据访问均由托管在 MS 服务器中的一组中间层服务提供。在本文中,我将重点介绍该开发工作的一个方面——比较几种将来自多个 Web 服务调用的值合并到一个 DataWindow 结果集中的技术。

背景

远程服务的性质是它们通常由不同于客户端开发人员的 IT 团队控制。客户端开发人员通常无法调整返回的远程方法值对象的结构或内容。开发人员必须“将就”使用从远程方法调用返回的值,并绕过数据结构设置的任何障碍或限制。这种情况在某种程度上类似于任何处理遗留数据存储机制的开发人员所面临的情况。表中数据的结构通常不适合客户端演示的需求。幸运的是,对于关系型 DBMS,开发人员可以通过利用 SQL 在表之间形成关系的能力来调整 SQL Select 语句以检索所需的列。在 PowerBuilder universe 中,对于 SQL Select DataWindows 来说确实如此,开发人员可以控制客户端数据源 SQL。然而,在 Web 服务的情况下,没有规范可以连接多个 Web 服务调用以查找单个统一的结果集。DataWindow 只能从单个服务方法的定义构建,并且客户端开发人员无法更改返回的内容。

有一个 SQL 功能是 DataWindow 开发人员经常利用的,以允许他们向 DataWindow 缓冲区添加外部值。SQL 允许您在列列表中定义虚拟或计算列。DataWindow 将识别这些列,并为其值分配客户端缓冲区空间。开发人员可以使用 SetItem(  ) 调用或 .Object 表达式从外部源“手动”填充这些列。然而,对于 Web 服务数据源 DataWindows,结果集内容是基于服务描述(WSDL 或 SVC)文档中返回的值来固定的。开发人员无法在缓冲区中添加或删除“虚拟”列。有趣的是,对于外部 DataWindow 对象,Painter 允许在列规范视图上编辑和添加列。Web 服务 DataWindow 则不然;Painter 不允许您添加或删除列定义。如果开发人员需要在单个 DataWindow 演示中呈现来自多个 WS 调用的值,他该怎么办?缓冲区中没有地方可以放置其他值!

我将描述我如何处理这个问题。一个警告:任何解决方案都必须利用 PowerBuilder DataWindow 技术的原生能力,而不涉及编写大量丑陋的代码来弥补平台能力的明显不足。在连接结果集的情况下,一种丑陋且代码繁重的解决方案是定义一个外部数据源 DataWindow,并使用 PowerScript 手动填充来自两个单独的 Web 服务调用的返回值(3 DataWindow 解决方案)。嘿,难道没有一个 DWQL 脚本语言允许连接和关联 DataWindow 缓冲区不更好吗?

使用案例

这是我正在处理的场景。Portfolio 显示结果集的大部分直接来自单个 Web 服务调用。我使用 WS DWO 实现它。图 1 显示了完成的 DWO,其中标出了问题项。每个持仓的当前价格必须从第二个服务调用中获取。当前价格也是 Market Value 和 Gain (Loss) 计算对象表达式的输入。图 2 显示了需要调用的方法以获取所需的值。图 3 显示了返回的值对象及其数据属性。如果您不熟悉,请注意,WS DataWindow 会自动将返回的值对象数组转换为 DataWindow 结果集。

Werde_20Figure_201_0.jpg

图 1:Portfolio DataWindow

Werde_20Figure_202_0.jpg

图 2:服务方法

Werde_20Figure_203_0.jpg

图 3:返回的值对象

方法一:调用全局函数的计算表达式

第一种方法是在 DataWindow 演示中放置一个计算对象,其表达式调用了一个包装 Web 服务调用的全局函数。该解决方案符合我的标准,因为它是一种 PowerBuilder 式的方法,只需要最少的编码。测试表明,虽然该解决方案有效,正确的结果已返回,但性能缓慢。一些调试表明每次都会进行重复的服务调用。罪魁祸首:全局函数调用表达式(当前价格)被其他表达式(市场价值和收益/亏损)引用。看起来表达式引擎每次引用表达式时都需要一个新值,因此它每次都会调用全局函数。显然,出于性能原因,我放弃了这种方法。但是,我认为当表达式未在 DataWindow 对象内的其他地方引用时,该方法仍然有效。

方法二:修改 DataWindow 列定义列表

当研究 12.0 Classic WS DataWindow Painter 中的列列表时,第二种方法突然出现创新。图 4 显示了列列表与返回的值对象属性定义进行了比较。

Werde_20Figure_204_0.jpg

图 4:列规范与 Bean 属性

您可以清楚地注意到 DWO 中高亮的列,这些列不在返回的 Bean 中。对于每个 Out 参数,DWO 定义工具都会添加一个额外的“丢弃”列,类型为 long;HoldingID 得到 HoldingIDspecified,依此类推。我将这一事实与另外两个事实结合起来。一、在 Classic Web Service DWO Painter 中,列名和数据类型在列规范视图上都是可编辑的。二、我将要使用的数值永远不会超过 long 的存储容量。我所做的是劫持(编辑)列名和类型以适应我的需求。这个小小的技巧给了我可以通过标准 SetItem( ) 方法调用设置值的缓冲区项。图 5 显示了我修改的结果。

Werde_20Figure_205.jpg

图 5:修改的列规范

图 6 显示了用 Web 服务调用返回值填充项的循环。

Werde_20Figure_206_0.jpg

图 6:从 WS 调用返回值设置项

结论

SOA 应用程序正逐渐成为业务应用程序软件中的时尚。PowerBuilder 提供了高质量的工具和构造,使您能够快速构建有效的服务客户端。尽管技术和工具仍在发展,但坚持不懈的开发人员可以发现变通方法来创建高质量的应用程序。

与所有事情一样,如果您牢记这三个原则,您总能找到一个恰当而有效的解决方案来解决编程问题

  1. 第一个解决方案不一定是最好的
  2. 正确的解决方案适合其环境的个性
  3. 如果你第一次不成功,继续尝试!
© . All rights reserved.