Поделиться через


Принудительная проверка на уровне кода

Проверка в императивном коде доступна для действий, производных от CodeActivity, AsyncCodeActivity и NativeActivity, и служит простым способом автономной проверки действия. Код проверки, определяющий все ошибки и предупреждения проверки, добавляется к действию.

Использование проверки на основе кода

Проверка на основе кода поддерживается действиями, которые являются производными от CodeActivity, AsyncCodeActivity и NativeActivity. Код проверки можно поместить в переопределение метода CacheMetadata, при этом ошибки и предупреждения проверки могут быть добавлены к аргументу метаданных. В следующем примере, если значение Cost больше Price, к метаданным добавляется ошибка проверки.

Примечание.

Обратите внимание, что Cost и Price являются не аргументами для действия, а свойствами, задаваемыми во время разработки. Поэтому их значения можно проверить в переопределенном методе действия CacheMetadata. Значение потока данных, проходящее через аргумент, не может быть проверено во время разработки, поскольку данные не будут поступать до времени выполнения, но аргументы действия можно проверить, чтобы убедиться, что они связаны, с помощью атрибута RequiredArgument и групп перегруженных вариантов. В этом примере код видит атрибут RequiredArgument для аргумента Description и, если он не связан, формируется ошибка проверки. Обязательные аргументы рассматриваются в обязательных аргументах и группах перегрузки.

public sealed class CreateProduct : CodeActivity  
{  
    public double Price { get; set; }  
    public double Cost { get; set; }  
  
    // [RequiredArgument] attribute will generate a validation error
    // if the Description argument is not set.  
    [RequiredArgument]  
    public InArgument<string> Description { get; set; }  
  
    protected override void CacheMetadata(CodeActivityMetadata metadata)  
    {  
        base.CacheMetadata(metadata);  
        // Determine when the activity has been configured in an invalid way.  
        if (this.Cost > this.Price)  
        {  
            // Add a validation error with a custom message.  
            metadata.AddValidationError("The Cost must be less than or equal to the Price.");  
        }  
    }  
  
    protected override void Execute(CodeActivityContext context)  
    {  
        // Not needed for the sample.  
    }  
}  

По умолчанию ошибка проверки добавляется к метаданным при вызове AddValidationError. Чтобы добавить предупреждение проверки, используйте перегрузку AddValidationError, принимающую ValidationError, и укажите, что ValidationError представляет предупреждение, задав свойство IsWarning.

Когда рабочий процесс модифицируется в конструкторе, выполняется проверка и любые ошибки или предупреждения, выявленные в ее ходе, отображаются в конструкторе. Также проверка происходит во время выполнения, когда вызывается рабочий процесс, и при появлении каких-либо ошибок проверки логикой проверки по умолчанию выдается исключение InvalidWorkflowException. Дополнительные сведения о вызове проверки и доступе к любым предупреждениям или ошибкам проверки см. в разделе "Вызов проверки действия".

Исключения, вызванные в методе CacheMetadata, не считаются ошибками проверки. Эти исключения перейдут из метода Validate к вызывающему объекту, который должен их обработать.

Проверка на основе кода используется для проверки действий, которые содержат код, но для нее недоступны другие действия в рабочем процессе. Декларативная проверка ограничений обеспечивает возможность проверки связей между действием и другими действиями в рабочем процессе и рассматривается в разделе декларативных ограничений .