欢迎来到天天文库
浏览记录
ID:17662704
大小:238.00 KB
页数:11页
时间:2018-09-04
《wf学习笔记(三)——规则与规则集》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、目录一概述二常用类型三定义规则条件四定义规则集一概述 规则是一条关于数据的声明性语句。在规则中声明了希望在运行时计算的条件,根据结果执行不同的操作。 规则由3部分组成:·条件Boolean类型表达式。·Then操作条件为true时的操作。·Else操作条件为false时的操作。 要在程序中使用规则引擎,首先要将业务逻辑需求组织为单独的规则(Rule),然后再将规则组织到规则集(RuleSet)中。规则与规则集都是程序代码。定义的规则是由规则引擎来执行的。规则的实际执行和计算是基于数据的,并且
2、能和其他规则进行交互。规则集在执行时会计算每个规则,并执行合适的操作。默认情况下,规则会根据规则名称的字母顺序来执行,但可以显式指定。默认不会显式指定计算顺序,因为工作流规则引擎支持“正向链接”,它通过发现并监视规则之间的依赖关系项来工作。如果规则修改的变量会影响之前计算过的规则在其条件中引用的话,正向连接就会使之前的规则再次进行计算。(可以显式地控制规则依赖项,也可以完全关闭正向链接。) 当规则条件或操作引用了一个字段或属性时,规则引擎能够自动地标识依赖项,并控制正向链接。但是,当条件或操作执
3、行方法时,规则引擎就无法自己来确定依赖项了,此时需要我们显式地指定依赖项(使用特性)。 在工作流中添加了规则之后,它们就会被序列化到单独的.rules文件,并生成为项目的嵌入式资源。rules资源就会在执行期间进行反序列化。http://touxiang.qqq90.com也可以讲该文件保存到项目外部,然后在代码中显式地进行反序列化操作。这种分离提供了在不修改应用程序代码的前提下,更新业务逻辑规则的方法。 基于规则的应用程序具有以下优势:·规则将业务规则和程序代码清晰地分离。·规则是声明业务需
4、求和数据间关系的一种极为简单的方式。·规则能够更加轻松地将业务需求翻译成能够运转的应用程序。·基于规则的应用程序为真实的业务规则提供了更大的可视性。·基于规则的应用程序具有更强的扩展性和适应性。二常用类型 RuleSet、Rule、RuleAction的关系如下图所示: 每个RuleSet包含多个Rule,而每个Rule又包含多个RuleAction的派生类实例。 Rule类用来声明单个业务规则。该类是单个规则条件以及至多两个规则操作的容器。其中一个操作会在条件计算为true时执行,另一个操
5、作(如果定义)则会在条件为false时执行。 Role类的ThenAction和ElseAction属性都是IList类型的,RuleAction是抽象类,在构造实例时其常用的派生类型如下:三定义规则条件(一)声明性规则条件(DeclarativeRuleCondition) 打开规则编辑器: 定投规则条件:(二)代码条件(CodeCondition) 通过对ConditionalEventArgs事件参数的Result进行赋值来返回结果,其代码形如:privat
6、evoidIsTwo(objectsender,ConditionalEventArgse){e.Result=this.Number==2;} 使用代码条件时,如果涉及到某个活动,则需要考虑活动执行上下文。工作流中的代码可以访问代表了子活动的变量,http://tx.qqlove789.com但是需要以上下文安全的方式访问该活动。在定义代码条件中要使用标准的语法来获取当前活动,而非模板。该实例在以后的文章中再做探讨,本篇博文实例并不适合演示该语法。四定义规则集(一)规矩集的简单设置 打开规则
7、集编辑器: 定义规则集:(二)正向链接与ChainingBehavior 当规则条件或操作引用了一个字段或属性时,规则引擎就能轻松地标识依赖项,并使用它来控制正向链接。如果某个操作修改了字段或属性,它就会标识其他在条件中引用同一个字段或属性的规则。 VS默认不会指定规则执行顺序,我个人的习惯是不管是使用何种ChainingBehavior类型,我都会显式指定规则执行顺序,原因是这样可以增加代码的可读性。如果不指定执行顺序,那么,在构造操作表达式时就应该考虑到操作执行的顺序的无关性情况,而不应
8、该构造出会由执行顺序造成结果变动的表达式。例如:规则名称条件ThenElse优先级描述Discountthis.Count>10this.Total=this.Price*this.Count*0.95+15this.Total=this.Price*this.Count+152多余10件打95折Vipthis.IsVipthis.Total=this.Total* 00.9会员打9折Freightthis.Total-15>=50this.Total=this.Total-15
此文档下载收益归作者所有