Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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. K ověření dochází také za běhu při vyvolání pracovního postupu a pokud dojde k nějakým chybám ověření, InvalidWorkflowException 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řijímá kořenovou aktivitu k ověření a vrací kolekci chyb a varování z ověření. 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);
}
}
Po zavolání Validate na tento ukázkový pracovní postup se vrátí dvě chyby při ověřování.
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:Následující chyby byly zjištěny při zpracování stromu pracovního postupu:'Add': Hodnota pro argument 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 je argument Result 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í ověření založeného na kódu imperativním způsobem
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. Pokud je hodnota Cost větší než hodnota Price, přidá se do metadat u přepsání v CacheMetadata 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 poskytnout ověřovací logiku v přepsaní metody aktivity CacheMetadata. Všechny výjimky, které CacheMetadata vyvolá, nejsou považovány za chyby ověřování. Tyto výjimky uniknou z volání Validate a musí být zpracovány volajícím.
Použití ValidationSettings
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, která se ověřuje ve stromu aktivit, existuje vyhledávání v 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 pracovního postupu, aby pro workflowy přidali dodatečná ověřování, například politické omezení pro nástroje jako FxCop. Další informace o omezeních naleznete v tématu Deklarativní omezení.
Chcete-li použít ValidationSettings, nakonfigurujte požadované vlastnosti a poté ho předejte do volání Validate. V tomto příkladu se ověřuje pracovní postup, který se skládá z Sequence s vlastní aktivitou Add. 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ěřování při nastavení SingleLevel na true, takže je ověřována 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í nebo chyby I když Add má aktivita požadované argumenty, které nejsou svázané, ověření je ú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, celé ověření nakonfigurované v pracovním postupu se vyhodnotí a InvalidWorkflowException bude vyvolána.
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.