Welcome

首页 / 软件开发 / .NET编程技术 / WF从入门到精通(第十二章):策略和规则

WF从入门到精通(第十二章):策略和规则2010-06-03 cnblogs GuoYong.Che1.知道在工作流处理过程中怎样进行策略和规则的处理

2.理解前向链接以及这是如何影响到基于规则的工作流处理过程的

3.为工作流处理过程创建规则

4.结合Policy活动来使用规则

我敢肯定,我们中的大多数人编写面向过程的代码(imperative code)都很轻松自在。过程式代码指通过编程来实现业务处理过程的C#代码,例如,读取一个数据库表,增加这个表中某些列的值,然后把它们统统都写到另一个数据库的表中。

但在本章,我们将深入规则,规则是对工作流的执行进行控制的一种机制,但它被看作是声明性的(declarative)。通常,声明性代码并不会被编译进程序集中,而是在应用程序执行时被解释。ASP.NET 2.0中有许多新的特征就是声明性的,这其中包括数据绑定和改进了的模板控件。它们能够让你在写ASP.NET应用程序时不使用C#代码就可去执行数据绑定或者其它复杂的控件呈现任务。

Windows Workflow Foundation(WF)也具有声明性的能力,但它是对规则和策略进行绑定而不是数据。你不能使用HTML或者ASP.NET的构造来声明你的规则,当然,涉及的概念都是相似的。

但是什么是规则,什么又是策略呢?

策略和规则

当我写一个涉及到数据或业务过程的程序时,我都会对数据或业务过程进行理解并把它转换成计算机去执行的代码。例如,考虑这样一个对帐目进行检查的处理逻辑:“假如在AvailableBalance列中的值少于要求的值,将抛出一个OverdraftException异常。”这似乎很简单...下面是表达这个行为的一些伪代码:

IF (requestedValue > AvailableBalance) THEN
throw new OverdraftException("Insufficient funds.")

但是要是银行客户具有透支保障功能,假如主账户资金不足时能对次账户进行存取又会怎么样呢?要是客户没有透支保障功能但是可自动设置透支范围的信贷业务又会怎么样呢?要是客户两样都有呢……我们该使用哪一个呢?

就像你能预见到的,为了对各种情况都进行检查,代码就会变得既复杂又混乱。更糟糕的是,它不能很方便地移植到其它业务处理过程中,并且它维护起来可能也很困难。

更进一步,我们看到了这些不只是去进行数据处理而且还有数据之间的关系。在代码中,我们运用过程化的处理方式来对关系进行处理,这些通常都会被翻译成许多嵌套的if语句,swith语句和循环。假如以前你在处理过程中使用了大量的if语句去对所有可能的条件检查,你或许应该问问自己是否已经没有更好的方式了。

至少在WF中有更好的方式。我们可以创建声明性规则然后使用规则引擎(rules engine)来处理它们。声明性规则对关系进行描述说明,它也适合应用到潜在要进行判断的地方。

WF承载了一个规则引擎(rules engine)。该规则引擎可使用XML格式编码的规则,并且能把这些规则应用到你的工作流的方法和字段中。在WF中,你能把面向过程的代码和声明性规则两者结合在一起形成一个总的解决办法。

WF中主要有两个地方会用到规则处理:条件处理和策略。你将发现条件处理是IfElse、While、Replicator以及ConditionedActivityGroup这些活动的一部分。假如你回顾一下第9章“逻辑流活动”和第11章“并行活动”的话,在那些地方介绍和示范的活动中,在每种情况下我都使用一个代码条件来对处理流程进行判断。当然,代码条件的实现是你工作流处理类中的一个事件处理程序(它通过WF所提供的一个CodeCondition类被绑定)。但是,在本章中你将开始使用规则条件进行替换。直到目前在本书中还没有体验过策略的使用,但在本章中当我介绍Policy活动时将对策略进行演示。

备注:对于WF和基于规则的处理可以写完整地一本甚至是一部系列丛书。我不可能在本章覆盖到各个方方面面。但可以做到的是对几个关键的概念进行介绍,这些概念对于你来说是全新的,并且也为你提供了一些基于WF的应用程序,它们用来对基于规则的处理过程的某个特定方面进行演示。假如你对这些话题感兴趣,我强烈建议你花些宝贵时间到Google上(http://www.google.com/),大量的网站都有关于在基于工作流的系统中实现业务处理流程方面的论文和资料。

在WF中,规则(rule)通过条件来表示,它返回一个Boolean值,并伴随着一个或多个操作。WF中规则风格的布局遵循if-then-else风格。规则引擎对条件进行判断,然后指挥工作流按照条件处理的结果去执行。在一定程度上,规则类似于脚本代码,与规则引擎一起充当脚本执行环境。在面向过程的代码之上使用规则的优点是规则能很容易地进行修改,以让你部分的业务处理过程更容易地适应易变的环境。

在WF术语中的策略是指规则的集合,它被包含到一个规则集(RuleSet)中。这使有些被称作前向链接(forward chaining)的事情变得更方便,这个假想的术语指的是在当前处理规则发生改变导致状态变化后,能对规则重新进行判定。