本文内容来自Microsoft Hands-on Labs for Windows Workflow Foundation中的HOL02中的第三个练习,其中包括两个任务:
添加一个验证来检查Email参数。
Ø 添加一个Email验证的Code Activity
Ø 测试这个验证
这个练习中,将扩展练习2中的项目,验证发送邮件地址的属性内容Email格式是否正确。
Designer:这个组件定义了workflow中的activity和custom activity设计的直观表示。
Code generator:这是一个扩展,用来生成工作流中activity的自定义代码。InvokeWebService这个开箱即用的activity就是这样。
Validator:这个组件增强了设计时和运行时的activity符号。
Toolbox item:定义了activity在Visual Studio的设计环境中,在工具箱中显示的自定义行为。
Executor:这是一个无状态的组件,用来执行activity的execution semantics。这个组件不会在简单的情况下定义,例如前面一个练习的情况下才会被覆写。
Serializer:如果需要提供自定义的序列化行为。
Deployer:当工作流包含activity,运行代码时将部署到主环境中。
1.在解决方案资源管理器中,在SendMailActivityLibrary中添加一个Code File,名字为ParametersValidator.cs。
2.添加如下代码来建立适当的继承关系。ActivityValidator类包含设计时和运行时的验证逻辑来确保activity被适当的配置。自定义的验证类继承自ActivityValidator还是CompositeActivityValidator基类,依赖于你的activity是一个基本的还是一个复合的。在工作流编译的时候和运行时,当activity动态更新执行时自动执行验证。
using System;
using System.Collections.Generic;
using System.Text;
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Compiler;
using System.Text.RegularExpressions;
using System.Net.Mail;
namespace SendMailActivityLibrary
{
public class ParametersValidator : ActivityValidator
{
}
}
3.覆写ValidateProperties方法,这样我们可以在自定属性上执行自定义验证。Activity的ValidateProperties方法主要用来校验Activity属性的编译语法。这个验证组件将检查Email地址是否为正确的格式。
public override ValidationErrorCollection ValidateProperties(ValidationManager manager, object obj)
{
ValidationErrorCollection validationErrors = new ValidationErrorCollection(base.ValidateProperties(manager, obj));
SendMailActivity sendMailActivityToBeValidated = obj as SendMailActivity;
if (sendMailActivityToBeValidated == null)
{
throw new InvalidOperationException("Parameter obj is not of type SendMailActivity");
}
if (!IsValidEmailAddress(sendMailActivityToBeValidated.To))
{
ValidationError CustomActivityValidationError = new ValidationError(String.Format("\'{0}\' is an Invalid destination e-mail address", sendMailActivityToBeValidated.To), 1);
validationErrors.Add(CustomActivityValidationError);
}
if (!IsValidEmailAddress(sendMailActivityToBeValidated.From))
{
ValidationError CustomActivityValidationError = new ValidationError(String.Format("\'{0}\' is an Invalid source e-mail address", sendMailActivityToBeValidated.From), 1);
validationErrors.Add(CustomActivityValidationError);
}
return validationErrors;
}
4.你会注意到里面调用了一个方法叫IsValidEmailAddress。这是验证部分的引擎,它检查字符串是否为一个有效的Email地址。
public Boolean IsValidEmailAddress(string address)
{
// must only proceed with validation if we have data
// to validate
if (address == null || address.Length == 0)
return true;
Regex rx = new Regex(@"[^A-Za-z0-9@\-_.]", RegexOptions.Compiled);
MatchCollection matches = rx.Matches(address);
if (matches.Count > 0)
return false;
// Must have an '@' character
int i = address.IndexOf('@');
// Must be at least three chars after the @
if (i <= 0 || i >= address.Length - 3)
return false;
// Must only be one '@' character
if (address.IndexOf('@', i + 1) >= 0)
return false;
// Find the last . in the address
int j = address.LastIndexOf('.');
// The dot can't be before or immediately after the @ char
if (j >= 0 && j <= i + 1)
return false;
return true;
}
5.查看SendMailActivity代码。把ActivityValidator加到SendMailActivity上。
[ActivityValidator(typeof(ParametersValidator))]
public partial class SendMailActivity : System.Workflow.ComponentModel.Activity
6.生成解决方案。
任务一完成。
7.打开SendMailWorkflow设计视图。选中SendMailActivity。在From属性中输入一个不正确的Email地址。
8.在设计视图上,SendMailActivity右上角会出现一个红色的叹号,将鼠标放在上面会看到验证后的错误提示。
9.修改后,Email地址验证通过,错误提示会消失。
10.保存文件,编译生成解决方案。
任务二完成。
参考资料: