您的位置:首页 > 其它

DA16 – 通过脚本实现客户端业务规则

2008-04-23 15:11 253 查看
DA16 – 通过脚本实现客户端业务规则


Data Abstract一大特性就是支持客户端业务规则脚本.本文将引导你去认识这个特性以及在DA应用中向客户端添加业务规则.
为什么使用客户端业务规则脚本?
在多层应用程序中,通常固定的规则都保存在中间层服务器,意味着你的服务端需要验证输入数据错误并遵从业务规则.
例如,在银行应用中,可能有一个业务规则规定一天只能从一个账户中提取$5000元- 服务端需要确保强制执行这个规则并拒绝违反这个规则的取款操作(例如银行雇员以外的输入了$6000元).
这种将所有的业务逻辑放在服务端处理的方式在错误输入的情况下是低效的,因为这些交易将需要发送到服务端验证并被拒绝而产生了大量无效网络流量.当开发一个强大的客户端时,希望使用尽可能简单的方式验证规则,最好是在用户输入完成后马上验证.
过去,这将使很多开发人员向客户端应用程序中复制一些业务规则,例如通过在TDataSets 的BeforePost事件TDataSets写如下代码:
procedure MyData.ds_TransferBeforePost(...);
begin
if ds_Transfer.FieldByName['Amount'].AsFloat > 6000 then
raise ...
end;
或使用Data Abstract2.0引入的强类型业务单元.
Data Abstract 提供了业务帮助类(Business Helper Classes)在首选强类型和可执行代码的稳定系统中很完美.他们在一些易于变动的环境下就不能很好的运行了,例如由于无法更新客户端应用程序而无法轻易更新业务规则,这包括开发工作(实际的应用程序升级)也包括部署工作(向数千台系统安装客户端).
业务规则脚本提供了一种解决方案,在集中的位置提供客户端业务规则-同你的数据一同定义在Schema中. 你可以继续使用Pascal语言写业务规则代码(比无类型代码要更加直接).当你要变更业务规则(如交易限制提升到$7500元),你只需要简单的修改一下Schema就可使所有客户端通过DARemoteService.GetScripts方法取得这些新的规则.
概括地说, Data Abstract基于应用程序的本质提供了可选的解决方案和选择. 意识到执行脚本和业务帮助类不是简单的非此即彼的交替运行很重要.其它重点值得注意:
能在客户端获取包,使帮助类在可变的系统中运行

使用脚本生成快速可变的规则,而使用业务帮助类生成强大的规则

脚本非常容易更新,尽管帮助类亦可能如此

不用通过IDE可以让用户自定义脚本.

定义业务规则
要为你的DataSet定义业务规则,点击"Business Rules"按钮或在DataSet的上下文菜单中选择"Business Rules":


将为你的DataSet打开业务规则编辑器(Business Rules Editor 简称BRE),包含代码编辑器,工具栏和底部的消息面板.工具栏包含三个下拉菜单允许你轻松的向业务规则脚本中增加新的代码:


Events下拉列表中包含所有你可以处理的事件.简单的选择一个事件,将自动在代码编辑器中加入新的方法声明.一旦增加一个事件处理后就可以在其中写代码了;你可以使用所有常规的Pascal语言结构(例如if/then,循环等).
你可以直接引用数据集中的字段定义, 同时可以通过Table变量去存取DataTable组件. (这些都可以很容易的从Variables下拉框中获取,你不需要去记忆他们).


最后,Actions 下拉框提供了一个脚本执行中常用的行为-如忽略执行或抛出一个错误信息.
例如,你可以写一个如下事件处理(需要的时候点击Variables/Actions)提供一个转账限制:


写完业务规则后点击Check按钮验证脚本-任何问题或错误都将在消息面板中显示并可以据此改正.
最后点击OK按钮关闭BRE,在Schema中保存业务规则.
运行业务规则
最后一个步骤准备在客户端执行这个业务规则.
打开客户端数据模块,并向其拖放一个TDAPSScriptingProvider组件.将其连接到DataTable的ScriptingProvider属性,完成.以后客户端应用程序在从服务端获取数据的时候,同时获取你创建的业务规则脚本并在需要的时候触发这些事件定义.


背景
在运行时,DataTable从服务端接收脚本连同数据集定义和数据.当DataTable相关事件(BeforePost, OnNewRecord等)触发时,将检查如果有业务逻辑脚本将之传递给TDAPSScriptingProvider.TDAPSScriptingProvider组件是一个Pascal脚本的脚本引擎将负责执行这些脚本.
当使用了ScriptingProviders,你有两个选项:
你可以为你的模块中的所有DataTable拖放一个Scripting Provider 组件并设置关联.这样这个scripting provider 将在所有DataTable直接共享

你可以为每个DataTable拖放一个单独的Scripting Providers.这样这些单独的Scripting Providers可在第一次调用后为每个DataTable缓存编译后的执行脚本, 可以提高执行效率-当脚本被编译后对应的事件可以快速执行,当脚本变化时会再次编译.

范例
Data Abstract 3包含一个新的BusinessRulesScripts范例(/Samples/BusinessRulesScripts目录)阐明了脚本支持.服务端应用程序开放了一个MiniWH 数据库Products表,包含一个范例字段允许你查看(改变)为Products定义的业务规则脚本.如你所见,在BeforePost事件中定义了一些约束,并在Schema中引入一个新的计算自动Gain,通过脚本对BuyPriceSellPrice做差计算其数值.


客户端,所有数据显示在Grid中,但是窗体还包含一个Refresh Scripts from Server按钮.应用程序运行后你可以在服务端改变脚本,然后点击Refresh Scripts from Server按钮,你的修改就可以在客户端使用了.例如, 在BeforePost事件增加一个新的约束
if SellPrice > 10000 then
RaiseError('Maximum price of $10,000 exceeded.');
,你将会在客户端修改数据将看到这个新的强制规则.或在OnCalcFields事件中修改Gain的技术方式,并在客户端查看Gain字段值的变化.
RemObjects Pascal 脚本
Data Abstract的业务规则脚本使用同DA同时安装的RemObjects Pascal 脚本(PS) 技术, 也可单独使用,免费发布在http://www.remobjects.com?ps. PS支持绝大多数Pascal语言特性为你写复杂的业务逻辑实现提供很大的灵活性. 请订阅PS主页,文档和新闻组查看Pascal 脚本的详细功能.
结论
本文包含了客户端脚本.在多层系统中业务规则通常在中间层实现,然而向服务端发送数据需要巨大开销以及通常开发者都需要将规则拷贝到TDataSet的事件处理中.当规则变化时随着所有客户端都需要更新而将引起一系列问题. Data Abstract客户端业务逻辑允许在客户端验证数据,也可以在服务端通过脚本动态的更新这些规则.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐