我不清楚何时以及如何在 WF 4.0 中的自定义活动/自定义活动工厂/自定义设计器中进行验证。
我的活动中唯一似乎提供验证错误支持的地方是在CacheMetadata方法中(我相信在设计过程中会多次调用它)。这是我应该进行验证的地方吗?ActivityDesigner 中是否支持验证?
我不清楚何时以及如何在 WF 4.0 中的自定义活动/自定义活动工厂/自定义设计器中进行验证。
我的活动中唯一似乎提供验证错误支持的地方是在CacheMetadata方法中(我相信在设计过程中会多次调用它)。这是我应该进行验证的地方吗?ActivityDesigner 中是否支持验证?
是的,您的活动中的 CacheMetadata 是您应该进行验证的地方。验证是一个适用于工作流运行时以及设计器的概念。(您可以从以下事实中看出这一点:您仍然可以尝试运行具有验证错误的已编译或声明式工作流,但这样做时会引发异常。)
例子:
protected override void CacheMetadata(ActivityMetadata metadata)
{
if (this.Body == 0) metadata.AddValidationError(
new ValidationError(
"You forgot to supply a body for (this activity)",
/*iswarning = */ true,
"Body"));
}
(参见ActivityMetadata.AddValidationError)
您的第二个问题是是否支持从 ActivityDesigner 端添加验证?答案是“不,不是真的”——可以做一些自定义 WPF 和数据绑定,在 ActivityDesigner 之上添加一些“自定义验证”,甚至可以使用 AttachedPropertiesService 在您的活动类上定义您自己的 SatisfiesConstraints 属性. 但这是额外的工作,并且不会始终与运行时验证相关联,因此这是一个价值有限的想法。
public class SalesCommissionValidation : CodeActivity<decimal>
{
public decimal NetSales { get; set; }
public decimal Percentage { get; set; }
protected override decimal Execute(CodeActivityContext context)
{
var commission = NetSales * (Percentage / 100);
return commission;
}
protected override void CacheMetadata(CodeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
if (NetSales <= 0)
metadata.AddValidationError("Sales cannot be less than 0!");
else if (Percentage <= 0)
metadata.AddValidationError("Sales percentgage cannot be less than 0!");
else
{
if (Percentage > 20)
metadata.AddValidationError(string.Format("Sales percentgage {0} cannot be greater than 20%", Percentage));
}
}
}