Workflow Foundation 4.0中设计时验证的模式是什么?

7

我不确定在WF 4.0中,我应该何时以及如何在自定义活动/自定义活动工厂/自定义设计师中进行验证。

似乎我的活动中唯一提供验证错误支持的地方是在CacheMetadata方法中(我认为在设计过程中会多次调用此方法)。我应该在此处进行验证吗?ActivityDesigner中是否支持验证?


作为对观众的说明,它在WPF上并不总是表现良好。最终,我创建了一个混合系统,其中我的基类(扩展NativeActivity)从实现中收集验证错误,并将其用于CacheMetadata调用和IDataErrorInfo。 - user1228
2个回答

4

是的,你应该在你的活动中使用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属性。但这需要额外的工作,并且不会与运行时验证始终保持一致,因此其价值有限。

(请参阅ActivityMetadata.AddValidationError


-1
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));
        }

    }
}

你的答案应该包含代码解释和描述它如何解决问题。 - AbcAeffchen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接