Какой шаблон для проверки во время разработки, в основу рабочих процессов 4.0?


Мне неясно, когда и как я должен выполнять проверку в моих пользовательских действиях / фабриках пользовательских действий/пользовательских конструкторах в WF 4.0.

Единственное место в моей деятельности, которое, кажется, обеспечивает поддержку ошибок проверки, находится в методе CacheMetadata (я считаю, что это вызывается несколько раз в процессе проектирования). Это то место, где я должен делать свою проверку? Есть ли поддержка валидации в ActivityDesigner?

2 6

2 ответа:

Да, 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 в вашем классе activity. Но это дополнительная работа, и она не будет последовательно увязываться с проверкой во время выполнения, поэтому это ограниченная идея ценности.

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

    }
}