WF4.0 Beta1之旅(5):规则引擎的变化
2010-10-01 08:33:17 来源:WEB开发网在WF3.x时代我们可以使用声明性的条件和代码方式的条件,也可以使用支持正向链接的RuleSet。当然我们还可以使用基于CodeDOM的API来用代码的方式声明。
在微软刚刚发布的WF4.0 Beta1中我们已经看不到这些了,WF4.0提供了统一的完全声明式的表达式(Expression)。现在的版本只支持使用VB来构建表达式(Expression),但是在设计上是可以支持任何语言的,微软也会在未来的版本中提供对其他语言的支持。
WF4.0中表达式是ValueExpression类型的,我们在VS中构造表达式的窗口是ExpressionTextBox类的实例,它也是可以再外部重新宿主的,只不过只有和VS结合的
时候才有智能感知和颜色的支持。在表达式中我们可以引用工作流中的变量和参数。这些信息都会被序列化到XAML中。提供了表达式(Expression)并不是就不
要原来的方式,微软在开发WF4.0一个很重要的部分就是对WF3.x全面兼容。在WF4.0中提供了一个Interop活动可以帮助我们很好的完成现有WF3.x程序的迁移,
我们只需要简单的设置它的Body Type属性即可,我们可以将WF4.0中的变量和参数绑定到WF3.x中的依赖属性上,如下图:
在WF4.0 beta1中没有提供对正向链接的RuleSet功能,官方已经声明会在将来的版本中加大这部分的投入。现在如果我们要想在WF4.0 Beta1使用类似的功能我们可以开发一个自定义活动来完成,下面的例子来源于WF Samples中,首先是活动的代码部分:
namespace Microsoft.Samples.Rules
{
using System;
using System.Activities;
using System.ComponentModel;
using System.Workflow.Activities.Rules;
using System.Workflow.ComponentModel.Compiler;
[Designer(typeof(Microsoft.Samples.Rules.PolicyDesigner))]
public sealed class Policy40Activity : NativeActivity
{
public RuleSet RuleSet { get; set; }
[IsRequired]
public InOutArgument TargetObject { get; set; }
public OutArgument<ValidationErrorCollection> ValidationErrors { get; set; }
protected override void OnOpen(DeclaredEnvironment environment)
{
if (this.RuleSet == null)
{
throw new System.ArgumentNullException("RuleSet property can't be null");
}
}
protected override void Execute(ActivityExecutionContext context)
{
// validate before running
Type targetType = this.TargetObject.Get(context).GetType();
RuleValidation validation = new RuleValidation(targetType, null);
if (!this.RuleSet.Validate(validation))
{
// set the validation error out argument
this.ValidationErrors.Set(context, validation.Errors);
// throw a validation exception
throw new ValidationException(string.Format("The ruleset is not valid. {0} validation errors
found (check the ValidationErrors property for more information).", validation.Errors.Count));
}
// execute the ruleset
object evaluatedTarget = this.TargetObject.Get(context);
RuleEngine engine = new RuleEngine(this.RuleSet, validation);
engine.Execute(evaluatedTarget);
// update the target object
this.TargetObject.Set(context, evaluatedTarget);
}
}
}
- ››WF 4.0 beta1中的跟踪机制
- ››WF 4.0的建模风格:顺序和Flowchart
- ››WF4.0 Beta1之旅(5):规则引擎的变化
- ››WF 4.0 beta1活动概览(1):Procedural
- ››WF4.0 Beta1之旅(4):Bookmark的使用
- ››WF4.0 Beta1之旅:基本介绍
- ››WF4.0 Beta1之旅(2):异常处理
- ››WF4.0 Beta1之旅(3):全新的FlowChart
- ››WF 应用场景指南: SharePoint 与工作流(上)
- ››WF 应用场景指南: 展现流(Presentation Flow)
- ››WF单元测试系列1:测试基本的Activity
- ››WF单元测试系列2:简单测试Activity的行为
赞助商链接