由于规则不是程序化的代码,你不能使用vs的调试器来调试,如果我们要调试有规则的工作流程序,我们可以开启规则引擎的Tracing功能。我们下面以一个例子来说明。我们需要建立一个顺序型工作流项目,在工作流设计器中放入一个PolicyActivity活动,然后设置其RuleSetReference属性,我们建立以下规则集。如下表所示:
Rule | Conditon | ThenAction | ElseAction |
RuleC | this.D < 100 | this.B = this.B - 12 | |
RuleB | this.B > 50 | this.C = "Preferred" | this.C = "Normal" |
RuleA | this.A > 10 | this.B = 60 | this.B = 40 |
规则编辑器如下图:
然后我们在项目中添加App.config文件,在配置文件开始规则的跟踪功能,代码如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.diagnostics> <switches> <add name="System.Workflow.Activities.Rules" value="ALL" /> <add name="System.Workflow LogToFile" value="1" /> </switches> </system.diagnostics> </configuration>
在此示例中,第二行添加节点启用文件的日志记录。该文件使用名称 WorkflowTrace.log 在宿主应用程序目录中创建。第一行中的TraceLevel属性值ALL表示所有可以预测到log信息都会被记录,如果你想过滤到一些log,你也可以指定Information和Verbose等,该选项通过将名称参数设置为等于“System.Workflow LogToTraceListener”来启用 TraceListener 的日志记录。这样设置后,Windows Workflow Foundation 将会枚举在宿主应用程序中创建的每个 TraceListener,并向它们发送所有日志记录信息。值属性的可能值包括:
值 | 说明 |
All | 记录接收到的所有消息 |
Off | 不记录任何消息 |
Critical | 仅记录关键消息 |
Error | 记录关键消息和错误消息 |
Warning | 记录关键、错误和警告消息 |
Information | 记录关键、错误、警告和提示消息 |
Verbose | 记录关键、错误、警告、提示和详细消息 |
工作流中赋响应初始值如下:
private int A = 12; private int D = 99; private int B = 0; private string C = "";
下面为宿主程序代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Workflow.Runtime; using System.Workflow.Runtime.Hosting; namespace CaryRuleTracing { class Program { static void Main(string[] args) { using(WorkflowRuntime workflowRuntime = new WorkflowRuntime()) { AutoResetEvent waitHandle = new AutoResetEvent(false); workflowRuntime.WorkflowCompleted += delegate(object sender,
WorkflowCompletedEventArgs e){waitHandle.Set();}; workflowRuntime.WorkflowTerminated += delegate(object sender,
WorkflowTerminatedEventArgs e) { Console.WriteLine(e.Exception.Message); waitHandle.Set(); }; WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof
(CaryRuleTracing.Workflow1)); instance.Start(); waitHandle.WaitOne(); } } } }
我们现在完成项目来运行程序,得到结果如下:
我们打开WorkflowTrace.log看看里面都记录了什么,下面只是log中部分的记录,你可以打开该文件查看详细记录:
规则“RuleA”条件 依赖项:“this/A/” |
1.Log的第一部分记录了各个规则的依赖项,当某个规则修改的时候会引擎哪些规则的重算。
2.从log我们可以看出规则的执行顺序并不是规则编辑器中设置的顺序,而是在优先级一样的情况下,按字母顺序来执行。我们例子中是RuleC,RuleB,RuleA,执行的顺序就不是了。
3.通过log我们也可以证实WF规则引擎的正向链接的特性,例子中RuleC引起了RuleB的重算。
这些只是WF中跟踪的一部分功能,我们后面后专门来学习WF中的跟踪的相关知识。