`

坚持学习WF(22):跟踪规则

阅读更多

 坚持学习WF文章索引

由于规则不是程序化的代码,你不能使用vs的调试器来调试,如果我们要调试有规则的工作流程序,我们可以开启规则引擎的Tracing功能。我们下面以一个例子来说明。我们需要建立一个顺序型工作流项目,在工作流设计器中放入一个PolicyActivity活动,然后设置其RuleSetReference属性,我们建立以下规则集。如下表所示:

Rule Conditon ThenAction ElseAction
RuleC this.D < 100

this.B = this.B - 12
System.Console.WriteLine("RuleC:Then" + this.B)

 
RuleB this.B > 50

this.C = "Preferred"
System.Console.WriteLine("RuleB:Then" + this.C)

this.C = "Normal"
System.Console.WriteLine("RuleB:Else" + this.C)

RuleA this.A > 10

this.B = 60
System.Console.WriteLine("RuleA:Then" + this.B)

this.B = 40
System.Console.WriteLine("RuleA:Else" + this.B)

 

规则编辑器如下图:

tracerule1

然后我们在项目中添加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(); } } } }
  
我们现在完成项目来运行程序,得到结果如下:
tracerule2 
    

我们打开WorkflowTrace.log看看里面都记录了什么,下面只是log中部分的记录,你可以打开该文件查看详细记录:

规则“RuleA”条件 依赖项:“this/A/”
规则“RuleA”THEN 副作用:“this/B/”
规则“RuleA”ELSE 副作用:“this/B/”
规则“RuleB”条件 依赖项:“this/B/”
规则“RuleB”THEN 副作用:“this/C/”
规则“RuleB”ELSE 副作用:“this/C/”
规则“RuleC”条件 依赖项:“this/D/”
规则“RuleC”THEN 副作用:“this/B/”
规则“RuleA”THEN 操作触发规则“RuleB”
规则“RuleA”ELSE 操作触发规则“RuleB”
规则“RuleC”THEN 操作触发规则“RuleB”
执行
计算规则“RuleA”的条件。
计算为 True 的规则“RuleA”条件。
计算规则“RuleA”的 THEN 操作。
计算规则“RuleB”的条件。
计算为 True 的规则“RuleB”条件。
计算规则“RuleB”的 THEN 操作。
计算规则“RuleC”的条件。
计算为 True 的规则“RuleC”条件。
计算规则“RuleC”的 THEN 操作。
规则“RuleC”副作用启用规则“RuleB”重新计算。
计算规则“RuleB”的条件。
计算为 False 的规则“RuleB”条件。
计算规则“RuleB”的 ELSE 操作。

 

1.Log的第一部分记录了各个规则的依赖项,当某个规则修改的时候会引擎哪些规则的重算。

2.从log我们可以看出规则的执行顺序并不是规则编辑器中设置的顺序,而是在优先级一样的情况下,按字母顺序来执行。我们例子中是RuleC,RuleB,RuleA,执行的顺序就不是了。

3.通过log我们也可以证实WF规则引擎的正向链接的特性,例子中RuleC引起了RuleB的重算。

这些只是WF中跟踪的一部分功能,我们后面后专门来学习WF中的跟踪的相关知识。

分享到:
评论

相关推荐

    坚持学习WF,WF学习教程

    坚持学习WF(22):跟踪规则 坚持学习WF(23):以代码的方式构造和执行RuleSet WF提供了非常灵活,强大和简单易懂的规则引擎。这几篇文章介绍了WF中规则引擎的相关知识。 坚持学习WF(24):WF中的异常处理 坚持学习WF...

    WF教程_坚持学习WF

    坚持学习WF(1):从HelloWorld开始 本文主要通过实现了一个可以接受参数的HelloWorld程序来了解WF。 坚持学习WF(2):WF创作模式和设计时工具 坚持学习WF(3):WF框架概览 2.3两篇主要全面的阐述了WF框架和Visual ...

    坚持学习WF

    坚持学习WF(20):规则引擎中的活动条件 坚持学习WF(21):规则引擎中的RuleSet 坚持学习WF(22):跟踪规则 坚持学习WF(23):以代码的方式构造和执行RuleSet WF提供了非常灵活,强大和简单易懂的规则引擎。这几篇文章介绍...

    坚持学习WF(1):从HelloWorld开始 源码

    在本篇“坚持学习WF(1):从HelloWorld开始”的源码分析中,我们将深入理解WF的基础知识和创建第一个工作流的步骤。 首先,让我们了解WF的基本概念。WF提供了一种模型化业务流程的方式,通过活动(Activities)来表示...

    坚持学习WF(5):自定义活动(CustomActivity) 源码

    在Windows Workflow Foundation (WF)中,自定义活动(CustomActivity)是开发人员根据特定业务需求创建的自定义...通过对`CaryActivity`源码的学习和分析,我们可以更好地理解WF的工作原理,提高我们的工作流开发能力。

    C# 利用 WF 实现规则引擎

    在标题“C# 利用 WF 实现规则引擎”中,我们可以推断出,这个项目是利用WWF的活动和工作流概念来构建一个规则引擎。规则引擎的核心在于能够定义、存储和执行一系列规则,这些规则可以影响应用程序的行为。通过使用...

    WF从入门到精通(第五章):workflow跟踪源码

    通过学习WF的workflow跟踪源码,你可以了解到如何自定义跟踪定义以满足特定需求,如何实现自定义跟踪参与者以扩展跟踪功能,以及如何调整跟踪配置以优化性能和日志记录。此外,源码分析还能帮助你在遇到问题时快速...

    基于 WF 的规则引擎 超级简单

    通过学习和实践这个项目,开发者可以深入理解WF规则引擎的工作原理,提升在业务流程自动化和规则管理方面的能力。同时,理解如何将WF规则引擎与C#应用程序无缝集成,为企业的业务流程提供更加灵活、可扩展的解决方案...

    WF从入门到精通(第十二章):策略和规则源码

    通过学习这一章,开发者将能够更好地理解和利用WF的策略和规则功能,设计出更符合业务需求的流程应用。深入研究源码,可以帮助开发者掌握WF的内在机制,提升开发效率和代码质量。同时,了解规则和策略的动态管理,...

    WF工作流学习资料

    WF工作流(Windows Workflow Foundation,简称WF)是微软.NET Framework的一部分,它提供了一种用于构建应用程序的模型,这种应用程序能够根据预定义的规则和步骤自动执行业务流程。WF结合了业务流程管理(BPM)和...

    Apress - Beginning WF: Windows Workflow in .NET 4.0 Mar 2010

    - **第13章:跟踪**:讲解如何在工作流执行过程中进行跟踪和监控。 - **第14章:事务**:探讨如何在工作流中使用事务来保证数据完整性。 - **第15章:带有持久性的事务**:介绍如何结合事务和持久化机制来增强...

    pro wf windows workflow in dot net 3.5

    7. **工作流跟踪和诊断**:讲解了如何使用WF内置的跟踪和日志功能,以及如何通过自定义跟踪参与程序来增强监控和诊断能力。 8. **工作流版本管理和迁移**:讨论了如何处理工作流的版本升级,以及如何在不中断服务的...

    wf工作流资料<转自网上的笔记>

    接着,"坚持学习WF(2):WF创作模式和设计时工具"会深入到WF的设计环境,比如Visual Studio中的工作流设计器,讲解如何利用这些工具来创建和编辑工作流。此外,还会介绍几种常见的工作流模式,如顺序工作流、并行工作...

    WF入门到精通+源码

    8. **跟踪与诊断**:WF提供了跟踪和诊断功能,可以帮助开发者监控工作流执行,定位问题并优化性能。 9. **版本控制**:WF支持版本升级,允许更新已部署的工作流,而不会中断正在运行的实例。 10. **源码分析**:...

    Beginning WF: Windows Workflow in .NET 4.0

    Beginning WF: Windows Workflow in .NET 4.0 By Mark Collins Publisher: Apress 2010 | 500 Pages | ISBN: 1430224851 | PDF | 4 MB Windows Workflow Foundation is a ground-breaking addition to the core ...

    WF学习从入门到提高

    "WF学习从入门到提高"的主题涵盖了从基础知识到高级技巧的全面学习路径,适合对WF感兴趣或需要在工作中应用WF技术的初学者和进阶者。 在WF的学习过程中,首先要理解的是WF的基本概念。WF提供了一种模型化的方式来...

    web wf 设计器

    Web WF(Workflow)设计器是一种基于Web的工具,用于创建、编辑和管理工作流流程。它允许用户通过图形化界面设计复杂的业务流程,而无需编写大量的代码。在本篇中,我们将深入探讨Web WF设计器的核心概念、功能以及...

    c#WF从入门到精通

    ### C# WF从入门到精通 #### 第一章:WF简介 **1.... - **工作流(Workflow)定义**:...通过以上章节的学习,读者可以全面掌握C# WF从基础到高级的各种技术要点和应用场景,从而能够有效地利用WF技术来解决实际问题。

Global site tag (gtag.js) - Google Analytics