我不确定在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"));
}
您的第二个问题是:是否支持从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));
}
}
}