Aufrufen der Aktivitätsvalidierung
Dieses Thema gilt für Windows Workflow Foundation 4.
Die Aktivitätsvalidierung stellt eine Methode bereit, um Fehler in der Konfiguration einer Aktivität vor der Ausführung zu identifizieren und zu melden. Eine Validierung wird ausgeführt, wenn ein Workflow im Workflow-Designer geändert und Validierungsfehler oder -warnungen im Workflow-Designer angezeigt werden. Die Validierung tritt auch zur Laufzeit auf, wenn ein Workflow aufgerufen wird und Validierungsfehler auftreten; dann wird ein InvalidWorkflowException-Objekt von der Standardvalidierungslogik ausgelöst. Windows Workflow Foundation (WF) stellt die ActivityValidationServices-Klasse bereit, mit der Entwickler von Workflowanwendungen und Tools eine Aktivität explizit validieren können. In diesem Thema wird beschrieben, wie Aktivitäten mit dem ActivityValidationServices-Objekt validiert werden.
Verwenden von ActivityValidationServices
Das ActivityValidationServices-Objekt verfügt über zwei Validate-Überladungen, mit denen die Validierungslogik einer Aktivität aufgerufen wird. Die erste Überladung akzeptiert die Stammaktivität, die validiert werden soll, und gibt eine Auflistung von Validierungsfehlern und -warnungen zurück. Im folgenden Beispiel wird eine benutzerdefinierte Add
-Aktivität verwendet, die über zwei erforderliche Argumente verfügt.
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);
}
}
Die Add
-Aktivität wird in einem Sequence-Objekt verwendet, die zwei erforderlichen Argumente werden jedoch nicht gebunden, wie im folgenden Beispiel gezeigt.
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))
}
}
};
Dieser Workflow kann validiert werden, indem Validate aufgerufen wird. Das Validate-Objekt gibt eine Auflistung aller Validierungsfehler und -warnungen zurück, die in der Aktivität selbst oder in ihren untergeordneten Elementen enthalten sind, wie im folgenden Beispiel gezeigt.
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);
}
}
Hinweis: |
---|
Autoren benutzerdefinierter Aktivitäten können in der CacheMetadata-Überschreibung einer Aktivität Validierungslogik bereitstellen. Von CacheMetadata ausgelöste Ausnahmen werden nicht als Validierungsfehler behandelt. Diese Ausnahmen werden im Aufruf von Validate nicht verarbeitet und müssen vom Aufrufer behandelt werden. |
Wenn Validate für diesen Beispielworkflow aufgerufen wird, werden zwei Validierungsfehler zurückgegeben.
Fehler: Für das erforderliche Aktivitätsargument 'Operand2' wurde kein Wert angegeben.
Fehler: Für das erforderliche Aktivitätsargument 'Operand1' wurde kein Wert angegeben.
Bei Aufruf dieses Workflows würde ein InvalidWorkflowException-Objekt ausgelöst werden, wie im folgenden Beispiel gezeigt.
try
{
WorkflowInvoker.Invoke(wf);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
System.Activities.InvalidWorkflowException:
Beim Verarbeiten der Workflowstruktur sind die folgenden Fehler aufgetreten:
'Add': Für das erforderliche Aktivitätsargument 'Operand2' wurde kein Wert angegeben.
'Add': Für das erforderliche Aktivitätsargument 'Operand1' wurde kein Wert angegeben.
Damit dieser Beispielworkflow gültig ist, müssen die zwei erforderlichen Argumente der Add
-Aktivität gebunden werden. Im folgenden Beispiel werden die zwei erforderlichen Argumente zusammen mit dem Ergebniswert an Workflowvariablen gebunden. In diesem Beispiel wird das Result-Argument zusammen mit den zwei erforderlichen Argumenten gebunden. Das Result-Argument muss nicht gebunden werden und verursacht keine Validierungsfehler, wenn es nicht gebunden ist. Es ist die Aufgabe des Workflowautors, das Result-Objekt zu binden, wenn sein Wert noch an einer anderen Stelle im Workflow verwendet wird.
new Add
{
Operand1 = Operand1,
Operand2 = Operand2,
Result = Result
}
Überprüfen der erforderlichen Argumente der Stammaktivität
Wenn die Stammaktivität eines Workflows über Argumente verfügt, werden diese erst gebunden, wenn der Workflow aufgerufen und die Parameter an den Workflow weitergegeben werden. Deshalb wird der folgende Workflow erfolgreich validiert. Es wird jedochber eine Ausnahme ausgelöst, wenn der Workflow aufgerufen wird, ohne dass die erforderlichen Argumenten übergeben werden, wie im folgenden Beispiel gezeigt.
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: The root activity's argument settings are incorrect.
Either fix the workflow definition or supply input values to fix these errors:
'Add': Value for a required activity argument 'Operand2' was not supplied.
'Add': Value for a required activity argument 'Operand1' was not supplied.
Sobald die richtigen Argumente übergeben werden, wird der Workflow erfolgreich abgeschlossen, wie im folgenden Beispiel gezeigt.
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);
}
Hinweis: |
---|
In diesem Beispiel wurde die Stammaktivität als Add und nicht wie im vorherigen Beispiel als Activity deklariert. Deshalb kann die WorkflowInvoker.Invoke -Methode eine einzelne ganze Zahl zurückgeben, die die Ergebnisse der Add -Aktivität darstellt und kein Wörterbuch mit out-Argumenten. Die wf -Variable hätte auch als Activity<int> deklariert werden können.
|
Bei der Validierung von Stammargumenten ist es die Aufgabe der Hostanwendung, sicherzustellen, dass alle erforderlichen Argumente beim Aufruf des Workflows übergeben werden.
Verwenden von ValidationSettings
Standardmäßig werden alle Aktivitäten in der Aktivitätsstruktur ausgewertet, wenn die Validierung über das ActivityValidationServices-Objekt aufgerufen wird. Mit dem ValidationSettings-Objekt kann die Validierung auf unterschiedliche Weise angepasst werden, indem die zugehörigen drei Eigenschaften konfiguriert werden. SingleLevel gibt an, ob das Validierungssteuerelement die gesamte Aktivitätsstruktur durchlaufen oder nur Validierungslogik für die angegebene Aktivität anwenden soll. Die Standardeinstellung für diesen Wert ist false. AdditionalConstraints gibt zusätzliche Einschränkungszuordnungen von einem Typ zu einer Liste von Einschränkungen an. Es gibt für den Basistyp jeder Aktivität in der Aktivitätsstruktur, die validiert wird, eine Suche in AdditionalConstraints. Wenn eine passende Einschränkungsliste gefunden wird, werden alle Einschränkungen in der Liste für die Aktivität ausgewertet. OnlyUseAdditionalConstraints gibt an, ob das Validierungssteuerelement alle Einschränkungen oder nur die in AdditionalConstraints angegebenen Einschränkungen auswerten soll. Der Standardwert ist false. AdditionalConstraints und OnlyUseAdditionalConstraints sind nützlich, wenn Workflow-Hostautoren zusätzliche Validierung für Workflows hinzufügen möchten, z. B. Richtlinieneinschränkungen für Tools wie FxCop. Weitere Informationen über Einschränkungen finden Sie unter Deklarative Einschränkungen.
Um ValidationSettings zu verwenden, konfigurieren Sie die gewünschten Eigenschaften, und übergeben Sie diese in den Aufruf von Validate. In diesem Beispiel wird ein Workflow überprüft, der aus einem Sequence- Objekt mit einer benutzerdefinierten Add
-Aktivität besteht. Die Add
-Aktivität verfügt über zwei erforderliche Argumente.
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);
}
}
Die folgende Add
-Aktivität wird in einem Sequence-Objekt verwendet, die zwei erforderlichen Argumente werden jedoch nicht gebunden.
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))
}
}
};
Im folgenden Beispiel wird die Validierung ausgeführt, während SingleLevel auf true festgelegt ist, sodass nur die Sequence-Stammaktivität validiert wird.
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);
}
}
In diesem Code wird die folgende Ausgabe angezeigt.
Keine Warnungen oder Fehler
Die Validierung ist auch dann erfolgreich, wenn die erforderlichen Argumente der Add
-Aktivität nicht gebunden sind, da nur die Stammaktivität ausgewertet wurde. Diese Art der Validierung ist nützlich, wenn nur bestimmte Elemente in einer Aktivitätsstruktur validiert werden, z. B. bei der Validierung einer Eigenschaftenänderung einer einzelnen Aktivität in einem Designer. Beachten Sie, dass bei einem Aufruf dieses Workflows die vollständige im Workflow konfigurierte Validierung ausgewertet und eine InvalidWorkflowException ausgelöst werden würde. Im ActivityValidationServices-Element und im ValidationSettings-Element kann nur eine Validierung konfiguriert werden, die explizit vom Host aufgerufen wurde, und keine Validierung, die beim Aufruf eines Workflows aufgerufen wird.