Udostępnij za pośrednictwem


Wywoływanie walidacji działania

Weryfikacja działania zapewnia metodę identyfikowania i zgłaszania błędów w konfiguracji dowolnego działania przed jego wykonaniem. Walidacja występuje, gdy przepływ pracy jest modyfikowany w projektancie przepływu pracy, a wszelkie błędy weryfikacji lub ostrzeżenia są wyświetlane w projektancie przepływu pracy. Walidacja występuje również w czasie wykonywania, gdy jest wywoływany przepływ pracy i jeśli wystąpią jakiekolwiek błędy walidacji, jest InvalidWorkflowException zgłaszany przez domyślną logikę walidacji. Program Windows Workflow Foundation (WF) udostępnia klasę ActivityValidationServices , która może być używana przez deweloperów aplikacji przepływu pracy i narzędzi do jawnego weryfikowania działania. W tym temacie opisano sposób wykonywania ActivityValidationServices walidacji działania.

Korzystanie z elementu ActivityValidationServices

ActivityValidationServices ma dwa Validate przeciążenia, które są używane do wywoływania logiki walidacji działania. Pierwsze przeciążenie pobiera działanie główne do zweryfikowania i zwraca kolekcję błędów i ostrzeżeń walidacji. W poniższym przykładzie jest używane działanie niestandardowe Add , które ma dwa wymagane argumenty.

public sealed class Add : CodeActivity<int>  
{  
    [RequiredArgument]  
    public InArgument<int> Operand1 { get; set; }  
  
    [RequiredArgument]  
    public InArgument<int> Operand2 { get; set; }  
  
    protected override int Execute(CodeActivityContext context)  
    {  
        return Operand1.Get(context) + Operand2.Get(context);  
    }  
}  

Działanie Add jest używane wewnątrz Sequenceelementu , ale jego dwa wymagane argumenty nie są powiązane, jak pokazano w poniższym przykładzie.

Variable<int> Operand1 = new Variable<int>{ Default = 10 };  
Variable<int> Operand2 = new Variable<int>{ Default = 15 };  
Variable<int> Result = new Variable<int>();  
  
Activity wf = new Sequence  
{  
    Variables = { Operand1, Operand2, Result },  
    Activities =
    {  
        new Add(),  
        new WriteLine  
        {  
            Text = new InArgument<string>(env => "The result is " + Result.Get(env))  
        }  
    }  
};  

Ten przepływ pracy można zweryfikować przez wywołanie metody Validate. Validate Zwraca kolekcję błędów weryfikacji lub ostrzeżeń zawartych w działaniu i wszystkich elementach podrzędnych, jak pokazano w poniższym przykładzie.

ValidationResults results = ActivityValidationServices.Validate(wf);  
  
if (results.Errors.Count == 0 && results.Warnings.Count == 0)  
{  
    Console.WriteLine("No warnings or errors");  
}  
else  
{  
    foreach (ValidationError error in results.Errors)  
    {  
        Console.WriteLine("Error: {0}", error.Message);  
    }  
    foreach (ValidationError warning in results.Warnings)  
    {  
        Console.WriteLine("Warning: {0}", warning.Message);  
    }  
}  

Po Validate wywołaniu tego przykładowego przepływu pracy zwracane są dwa błędy weryfikacji.

Błąd: Wartość wymaganego argumentu działania "Operand2" nie została podana.
Błąd: Wartość wymaganego argumentu działania "Operand1" nie została podana. Jeśli ten przepływ pracy został wywołany, zostanie zgłoszony błąd InvalidWorkflowException , jak pokazano w poniższym przykładzie.

try  
{  
    WorkflowInvoker.Invoke(wf);  
}  
catch (Exception ex)  
{  
    Console.WriteLine(ex);  
}  

System.Activities.InvalidWorkflowException:
Podczas przetwarzania drzewa przepływu pracy wystąpiły następujące błędy: "Dodaj": Wartość wymaganego argumentu działania "Operand2" nie została podana. Add": Wartość wymaganego argumentu działania "Operand1" nie została podana. Aby ten przykładowy przepływ pracy był prawidłowy, należy powiązać dwa wymagane argumenty Add działania. W poniższym przykładzie dwa wymagane argumenty są powiązane ze zmiennymi przepływu pracy wraz z wartością wyniku. W tym przykładzie Result argument jest powiązany z dwoma wymaganymi argumentami. Argument Result nie jest wymagany do powiązania i nie powoduje błędu walidacji, jeśli nie jest. Jest to odpowiedzialność autora przepływu pracy za powiązanie Result , jeśli jego wartość jest używana w innym miejscu przepływu pracy.

new Add  
{  
    Operand1 = Operand1,  
    Operand2 = Operand2,  
    Result = Result  
}  

Weryfikowanie wymaganych argumentów w działaniu głównym

Jeśli działanie główne przepływu pracy ma argumenty, nie są one powiązane do momentu wywołania przepływu pracy i przekazania parametrów do przepływu pracy. Poniższy przepływ pracy przechodzi walidację, ale zgłaszany jest wyjątek, jeśli przepływ pracy jest wywoływany bez przekazywania wymaganych argumentów, jak pokazano w poniższym przykładzie.

Activity wf = new Add();  
  
ValidationResults results = ActivityValidationServices.Validate(wf);  
// results has no errors or warnings, but when the workflow  
// is invoked, an InvalidWorkflowException is thrown.  
try  
{  
    WorkflowInvoker.Invoke(wf);  
}  
catch (Exception ex)  
{  
    Console.WriteLine(ex);  
}  

System.ArgumentException: ustawienia argumentów działania głównego są niepoprawne.
Napraw definicję przepływu pracy lub podaj wartości wejściowe, aby naprawić te błędy:"Dodaj": Wartość wymaganego argumentu działania "Operand2" nie została podana. Add": Wartość wymaganego argumentu działania "Operand1" nie została podana. Po przekazaniu prawidłowych argumentów przepływ pracy zakończy się pomyślnie, jak pokazano w poniższym przykładzie.

Add wf = new Add();  
  
ValidationResults results = ActivityValidationServices.Validate(wf);  
// results has no errors or warnings, and the workflow completes  
// successfully because the required arguments were passed.  
try  
{  
    Dictionary<string, object> wfparams = new Dictionary<string, object>  
    {  
        { "Operand1", 10 },  
        { "Operand2", 15 }  
    };  
  
    int result = WorkflowInvoker.Invoke(wf, wfparams);  
    Console.WriteLine("Result: {0}", result);  
}  
catch (Exception ex)  
{  
    Console.WriteLine(ex);  
}  

Uwaga

W tym przykładzie działanie główne zostało zadeklarowane jako Add zamiast Activity jak w poprzednim przykładzie. WorkflowInvoker.Invoke Dzięki temu metoda zwraca pojedynczą liczbę całkowitą reprezentującą wyniki Add działania zamiast słownika argumentówout. Zmienna wf mogła być również zadeklarowana jako Activity<int>.

Podczas sprawdzania poprawności argumentów głównych obowiązkiem aplikacji hosta jest zapewnienie, że wszystkie wymagane argumenty są przekazywane po wywołaniu przepływu pracy.

Wywoływanie weryfikacji opartej na kodzie imperatywnej

Walidacja oparta na kodzie imperatywnego umożliwia działanie w celu zapewnienia weryfikacji samego siebie i jest dostępne dla działań pochodzących z CodeActivity, AsyncCodeActivityi NativeActivity. Kod weryfikacji określający wszelkie błędy weryfikacji lub ostrzeżenia są dodawane do działania. Gdy walidacja jest wywoływana w działaniu, te ostrzeżenia lub błędy są zawarte w kolekcji zwracanej przez wywołanie metody Validate. W poniższym przykładzie zdefiniowano CreateProduct działanie. Jeśli wartość Cost jest większa niż Price, do metadanych w zastąpieniu CacheMetadata zostanie dodany błąd weryfikacji.

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.  
    }  
}  

W tym przykładzie przepływ pracy jest skonfigurowany przy użyciu CreateProduct działania . W tym przepływie pracy parametr Cost jest większy niż Priceargument , a wymagany Description argument nie jest ustawiony. Po wywołaniu walidacji zostaną zwrócone następujące błędy.

Activity wf = new Sequence  
{  
    Activities =
    {  
        new CreateProduct  
        {  
            Cost = 75.00,  
            Price = 55.00  
            // Cost > Price and required Description argument not set.  
        },  
        new WriteLine  
        {  
            Text = "Product added."  
        }  
    }  
};  
  
ValidationResults results = ActivityValidationServices.Validate(wf);  
  
if (results.Errors.Count == 0 && results.Warnings.Count == 0)  
{  
    Console.WriteLine("No warnings or errors");  
}  
else  
{  
    foreach (ValidationError error in results.Errors)  
    {  
        Console.WriteLine("Error: {0}", error.Message);  
    }  
    foreach (ValidationError warning in results.Warnings)  
    {  
        Console.WriteLine("Warning: {0}", warning.Message);  
    }  
}  

Błąd: Koszt musi być mniejszy lub równy cenie.
Błąd: Wartość wymaganego argumentu działania "Description" nie została podana.

Uwaga

Autorzy działań niestandardowych mogą zapewnić logikę walidacji w zastąpień działania CacheMetadata . Wszelkie wyjątki, CacheMetadata z których pochodzą, nie są traktowane jako błędy weryfikacji. Te wyjątki unikną połączenia Validate z elementem wywołującym i muszą być obsługiwane przez obiekt wywołujący.

Korzystanie z weryfikacji Ustawienia

Domyślnie wszystkie działania w drzewie działań są oceniane, gdy walidacja jest wywoływana przez ActivityValidationServiceselement . ValidationSettings umożliwia dostosowanie walidacji na kilka różnych sposobów przez skonfigurowanie jej trzech właściwości. SingleLevel Określa, czy moduł sprawdzania poprawności powinien przechodzić całe drzewo działań, czy tylko zastosować logikę walidacji do podanego działania. Wartość domyślna dla tej wartości to false. AdditionalConstraints Określa dodatkowe mapowanie ograniczeń z typu na listę ograniczeń. W przypadku podstawowego typu każdego działania w drzewie działań, które jest weryfikowane, znajduje się odnośnik do elementu AdditionalConstraints. Jeśli zostanie znaleziona lista pasujących ograniczeń, wszystkie ograniczenia na liście zostaną ocenione dla działania. OnlyUseAdditionalConstraintsOkreśla, czy moduł sprawdzania poprawności powinien ocenić wszystkie ograniczenia, czy tylko te określone w .AdditionalConstraints Domyślna wartość to false. AdditionalConstraints i OnlyUseAdditionalConstraints są przydatne dla autorów hostów przepływu pracy, aby dodać dodatkową walidację przepływów pracy, takich jak ograniczenia zasad dla narzędzi, takich jak FxCop. Aby uzyskać więcej informacji na temat ograniczeń, zobacz Deklaratywne ograniczenia.

Aby użyć ValidationSettingsmetody , skonfiguruj żądane właściwości, a następnie przekaż je w wywołaniu metody .Validate W tym przykładzie weryfikowany jest przepływ pracy składający się z Sequence działania niestandardowego Add . Działanie Add ma dwa wymagane argumenty.

public sealed class Add : CodeActivity<int>  
{  
    [RequiredArgument]  
    public InArgument<int> Operand1 { get; set; }  
  
    [RequiredArgument]  
    public InArgument<int> Operand2 { get; set; }  
  
    protected override int Execute(CodeActivityContext context)  
    {  
        return Operand1.Get(context) + Operand2.Get(context);  
    }  
}  

Następujące Add działanie jest używane w obiekcie Sequence, ale jego dwa wymagane argumenty nie są powiązane.

Variable<int> Operand1 = new Variable<int> { Default = 10 };  
Variable<int> Operand2 = new Variable<int> { Default = 15 };  
Variable<int> Result = new Variable<int>();  
  
Activity wf = new Sequence  
{  
    Variables = { Operand1, Operand2, Result },  
    Activities =
    {  
        new Add(),  
        new WriteLine  
        {  
            Text = new InArgument<string>(env => "The result is " + Result.Get(env))  
        }  
    }  
};  

W poniższym przykładzie walidacja jest wykonywana z ustawioną wartością SingleLeveltrue, więc tylko działanie główne Sequence jest weryfikowane.

ValidationSettings settings = new ValidationSettings  
{  
    SingleLevel = true  
};  
  
ValidationResults results = ActivityValidationServices.Validate(wf, settings);  
  
if (results.Errors.Count == 0 && results.Warnings.Count == 0)  
{  
    Console.WriteLine("No warnings or errors");  
}  
else  
{  
    foreach (ValidationError error in results.Errors)  
    {  
        Console.WriteLine("Error: {0}", error.Message);  
    }  
    foreach (ValidationError warning in results.Warnings)  
    {  
        Console.WriteLine("Warning: {0}", warning.Message);  
    }  
}  

Ten kod wyświetla następujące dane wyjściowe:

Brak ostrzeżeń ani błędów , mimo że Add działanie ma wymagane argumenty, które nie są powiązane, walidacja zakończy się pomyślnie, ponieważ oceniane jest tylko działanie główne. Ten typ weryfikacji jest przydatny do sprawdzania poprawności tylko określonych elementów w drzewie działań, takich jak walidacja zmiany właściwości pojedynczego działania w projektancie. Należy pamiętać, że jeśli ten przepływ pracy jest wywoływany, zostanie obliczona pełna walidacja skonfigurowana w przepływie pracy i zostanie wyrzucona InvalidWorkflowException . ActivityValidationServices i ValidationSettings skonfiguruj tylko walidację jawnie wywoływaną przez hosta, a nie walidację, która występuje po wywołaniu przepływu pracy.