Sdílet prostřednictvím


Vyvolání ověřování aktivit

Ověřování aktivit poskytuje metodu pro identifikaci a hlášení chyb v konfiguraci jakékoli aktivity před jejím spuštěním. K ověření dochází, když je pracovní postup změněn v návrháři pracovního postupu a všechny chyby nebo upozornění ověření se zobrazí v návrháři pracovního postupu. Při vyvolání pracovního postupu a pokud dojde k nějakým chybám ověření, InvalidWorkflowException vyvolá se také ověření za běhu, vyvolá se výchozí logika ověření. Windows Workflow Foundation (WF) poskytuje ActivityValidationServices třídu, kterou můžou používat aplikace pracovního postupu a vývojáři nástrojů k explicitnímu ověření aktivity. Toto téma popisuje, jak se používá ActivityValidationServices k ověřování aktivit.

Používání služeb ActivityValidationServices

ActivityValidationServices má dvě Validate přetížení, která se používají k vyvolání logiky ověřování aktivity. První přetížení převezme kořenovou aktivitu, která se ověří a vrátí kolekci chyb ověření a upozornění. V následujícím příkladu se používá vlastní Add aktivita, která má dva povinné 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);  
    }  
}  

Aktivita Add se používá uvnitř Sequence, ale jeho dva povinné argumenty nejsou vázány, jak je znázorněno v následujícím příkladu.

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

Tento pracovní postup lze ověřit voláním Validate. Validate vrátí kolekci všech chyb ověření nebo upozornění obsažených v aktivitě a všech podřízených objektech, jak je znázorněno v následujícím příkladu.

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

Při Validate zavolání tohoto ukázkového pracovního postupu se vrátí dvě chyby ověření.

Chyba: Hodnota argumentu požadované aktivity Operand2 nebyla zadána.
Chyba: Hodnota argumentu požadované aktivity Operand1 nebyla zadána. Pokud byl tento pracovní postup vyvolán, vyvolá se vyvolána chyba InvalidWorkflowException , jak je znázorněno v následujícím příkladu.

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

System.Activities.InvalidWorkflowException:
Při zpracování stromu pracovního postupu byly zjištěny následující chyby: Add: Hodnota argumentu požadované aktivity Operand2 nebyla zadána. Add': Hodnota argumentu požadované aktivity Operand1 nebyla zadána. Aby byl tento ukázkový pracovní postup platný, musí být vázány dva požadované argumenty Add aktivity. V následujícím příkladu jsou dva požadované argumenty vázány na proměnné pracovního postupu spolu s výslednou hodnotou. V tomto příkladu Result je argument vázán spolu se dvěma povinnými argumenty. Argument Result není nutné vázat a nezpůsobí chybu ověření, pokud ne. Autor pracovního postupu je zodpovědný za vytvoření vazby Result , pokud se jeho hodnota používá jinde v pracovním postupu.

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

Ověřování požadovaných argumentů v kořenové aktivitě

Pokud kořenová aktivita pracovního postupu obsahuje argumenty, nejsou vázány, dokud se pracovní postup nevyvolá a parametry se předají do pracovního postupu. Následující pracovní postup projde ověřením, ale je vyvolána výjimka, pokud je pracovní postup vyvolán bez předání požadovaných argumentů, jak je znázorněno v následujícím příkladu.

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: Nastavení argumentů kořenové aktivity je nesprávné.
Opravte definici pracovního postupu nebo zadejte vstupní hodnoty, které opraví tyto chyby:'Add': Hodnota pro argument požadované aktivity Operand2 nebyla zadána. Add': Hodnota argumentu požadované aktivity Operand1 nebyla zadána. Po předání správných argumentů se pracovní postup úspěšně dokončí, jak je znázorněno v následujícím příkladu.

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

Poznámka:

V tomto příkladu byla kořenová aktivita deklarována jako Add místo Activity jako v předchozím příkladu. Tato metoda umožňuje WorkflowInvoker.Invoke vrátit jedno celé číslo, které představuje výsledky Add aktivity místo slovníku argumentů out . Proměnná wf byla také deklarována jako Activity<int>.

Při ověřování kořenových argumentů je odpovědností hostitelské aplikace, aby se zajistilo, že se při vyvolání pracovního postupu předají všechny požadované argumenty.

Vyvolání imperativního ověřování založeného na kódu

Imperativní ověřování založené na kódu poskytuje jednoduchý způsob, jak aktivity poskytovat ověřování o sobě, a je k dispozici pro aktivity odvozené od CodeActivity, AsyncCodeActivitya NativeActivity. Ověřovací kód, který určuje chyby ověření nebo upozornění, se přidá do aktivity. Při vyvolání ověření aktivity jsou tato upozornění nebo chyby obsaženy v kolekci vrácené voláním Validate. V následujícím příkladu je definována CreateProduct aktivita. Cost Pokud je větší než hodnota Price, přidá se do metadat v CacheMetadata přepsání chyba ověření.

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

V tomto příkladu je pracovní postup nakonfigurován pomocí CreateProduct aktivity. V tomto pracovním postupu Cost je větší než Pricea požadovaný Description argument není nastaven. Při vyvolání ověření se vrátí následující chyby.

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

Chyba: Náklady musí být menší nebo rovny ceně.
Chyba: Hodnota argumentu požadované aktivity Popis nebyla zadána.

Poznámka:

Autoři vlastních aktivit můžou v přepsání aktivity poskytnout logiku CacheMetadata ověřování. Všechny výjimky, které jsou vyvolány CacheMetadata , nejsou považovány za chyby ověřování. Tyto výjimky uniknou z volání a Validate musí je zpracovat volající.

Pomocí ověřování Nastavení

Ve výchozím nastavení se všechny aktivity ve stromu aktivit vyhodnocují při vyvolání ověřením ActivityValidationServices. ValidationSettings umožňuje přizpůsobení ověření několika různými způsoby konfigurací jeho tří vlastností. SingleLevel určuje, zda má validátor procházet celý strom aktivit, nebo pouze použít ověřovací logiku pro zadanou aktivitu. Výchozí hodnota je false. AdditionalConstraints určuje další mapování omezení z typu na seznam omezení. Pro základní typ každé aktivity ve stromu aktivit, který se ověřuje, existuje vyhledávání AdditionalConstraints. Pokud se najde odpovídající seznam omezení, vyhodnotí se pro aktivitu všechna omezení v seznamu. OnlyUseAdditionalConstraints určuje, zda má validátor vyhodnotit všechna omezení, nebo pouze ty, které jsou zadány v AdditionalConstraints. Výchozí hodnota je false. AdditionalConstraints a OnlyUseAdditionalConstraints jsou užitečné pro autory hostitele pracovního postupu, aby přidali další ověřování pracovních postupů, jako jsou omezení zásad pro nástroje, jako je FxCop. Další informace o omezeních naleznete v tématu Deklarativní omezení.

Chcete-li použít ValidationSettings, nakonfigurujte požadované vlastnosti a pak jej předejte volání Validate. V tomto příkladu se ověří pracovní postup, který se skládá z Sequence vlastní Add aktivity. Aktivita Add má dva povinné 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);  
    }  
}  

Následující Add aktivita se používá v objektu Sequence, ale jeho dva povinné argumenty nejsou vázány.

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

V následujícím příkladu se provádí ověření s nastavenou SingleLevel na true, takže se ověří pouze kořenová Sequence aktivita.

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

Tento kód zobrazí následující výstup:

Žádná upozornění ani chyby , i když Add aktivita obsahuje povinné argumenty, které nejsou svázané, je ověření úspěšné, protože se vyhodnotí pouze kořenová aktivita. Tento typ ověřování je užitečný pro ověřování pouze konkrétních prvků ve stromu aktivit, jako je například ověření změny vlastnosti jedné aktivity v návrháři. Všimněte si, že pokud je tento pracovní postup vyvolán, je vyhodnoceno úplné ověření nakonfigurované v pracovním postupu a InvalidWorkflowException vyvolá se vyvolání. ActivityValidationServices a ValidationSettings nakonfigurujte pouze ověření, které explicitně vyvolá hostitel, a ne ověření, ke kterému dochází při vyvolání pracovního postupu.