指令式代码验证为活动提供简单的方法来进行自我验证,并适用于从CodeActivity、AsyncCodeActivity和NativeActivity派生的活动。 活动中添加了用于检测任何验证错误或警告的验证代码。
使用基于代码的验证
从 CodeActivity、AsyncCodeActivity 和 NativeActivity 派生的活动支持基于代码的验证。 验证代码可以放在CacheMetadata覆盖中,并且可以将验证错误或警告添加到元数据参数中。 在以下示例中,如果 Cost 大于 Price,则会将验证错误添加到元数据中。
注释
请注意, Cost 不是 Price 活动的参数,而是设计时设置的属性。 这就是为什么可以在 CacheMetadata 重写中验证其值的原因。 在设计时无法验证流经参数的数据的值,因为数据只有到运行时才能流动,但可以通过使用 RequiredArgument 属性和重载组来验证活动参数,以确保它们被正确绑定。 此示例代码会识别 RequiredArgument 参数的 Description 属性,如果未绑定,则会生成验证错误。 必需参数包含在 必需参数和重载组中。
public sealed class CreateProduct : CodeActivity
{
public double Price { get; set; }
public double Cost { get; set; }
// [RequiredArgument] attribute will generate a validation error
// if the Description argument is not set.
[RequiredArgument]
public InArgument<string> Description { get; set; }
protected override void CacheMetadata(CodeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
// Determine when the activity has been configured in an invalid way.
if (this.Cost > this.Price)
{
// Add a validation error with a custom message.
metadata.AddValidationError("The Cost must be less than or equal to the Price.");
}
}
protected override void Execute(CodeActivityContext context)
{
// Not needed for the sample.
}
}
默认情况下,调用AddValidationError时,会将验证错误添加到元数据中。 若要添加验证警告,请使用接受 AddValidationError 的 ValidationError 重载,并通过设置 ValidationError 属性来指定 IsWarning 表示一个警告。
当在工作流设计器中修改工作流时,验证过程会发生,并且任何验证错误或警告都会在工作流设计器中显示。 此外,当调用工作流时,如果发生任何验证错误,默认验证逻辑将引发 InvalidWorkflowException,此时,也将在运行时执行验证。 有关调用验证和访问任何验证警告或错误的详细信息,请参阅 调用活动验证。
从 CacheMetadata 引发的任何异常都不会被视为验证错误。 这些异常将从对 Validate 的调用中转义,并且必须由调用方进行处理。
基于代码的验证可用于验证包含代码的活动,但无法查看工作流中的其他活动。 声明性约束验证提供验证工作流中活动与其他活动之间的关系的功能,并且包含在 声明性约束 主题中。