Каков шаблон для проверки во время разработки в Workflow Foundation 4.0? - PullRequest
7 голосов
/ 01 декабря 2009

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

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

Ответы [ 2 ]

4 голосов
/ 19 декабря 2009

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

0 голосов
/ 23 сентября 2014
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));
        }

    }
}
...