활동 유효성 검사는 실행 전에 활동의 구성에서 오류를 식별하고 보고하는 메서드를 제공합니다. 유효성 검사는 워크플로 디자이너에서 워크플로가 수정되고 유효성 검사 오류 또는 경고가 워크플로 디자이너에 표시될 때 발생합니다. 워크플로가 호출될 때와 런타임에서 유효성 검사 오류가 발생하면, 기본 유효성 검사 논리에 의해 InvalidWorkflowException 예외가 발생합니다. WF(Windows Workflow Foundation)는 워크플로 애플리케이션 및 도구 개발자가 활동의 유효성을 명시적으로 검사하는 데 사용할 수 있는 클래스를 제공합니다 ActivityValidationServices . 이 항목에서는 활동 유효성 검사를 수행하는 데 사용하는 ActivityValidationServices 방법을 설명합니다.
ActivityValidationServices를 사용하여
ActivityValidationServices 에는 활동의 유효성 검사 논리를 호출하는 데 사용되는 두 개의 Validate 오버로드가 있습니다. 첫 번째 오버로드는 루트 작업의 유효성을 검사하고 유효성 검사 오류 및 경고 컬렉션을 반환합니다. 다음 예제에서는 두 개의 필수 인수가 있는 사용자 지정 Add 작업이 사용됩니다.
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);
}
}
작업은 Add 내에 Sequence 사용되지만, 다음 예제와 같이 두 개의 필수 매개변수가 결합되지 않았습니다.
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))
}
}
};
이 워크플로는 .를 호출 Validate하여 유효성을 검사할 수 있습니다. Validate 는 다음 예제와 같이 활동과 그 하위 요소에 포함된 모든 유효성 검사 오류 또는 경고의 컬렉션을 반환합니다.
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);
}
}
Validate 이 샘플 워크플로에서 호출되면 두 가지 유효성 검사 오류가 반환됩니다.
오류: 필수 작업 인수 'Operand2'에 대한 값이 제공되지 않았습니다.오류: 필수 작업 인수 'Operand1'에 대한 값이 제공되지 않았습니다. 이 워크플로가 호출된 InvalidWorkflowException 경우 다음 예제와 같이 throw됩니다.
try
{
WorkflowInvoker.Invoke(wf);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
System.Activities.InvalidWorkflowException:워크플로 트리를 처리하는 동안 다음 오류가 발생했습니다.'Add': 필수 활동 인수 'Operand2'에 대한 값이 제공되지 않았습니다.'Add': 필수 작업 인수 'Operand1'에 대한 값이 제공되지 않았습니다. 이 예제 워크플로가 유효하려면 활동의 두 필수 인수를 Add 바인딩해야 합니다. 다음 예제에서는 두 개의 필수 인수가 결과 값과 함께 워크플로 변수에 바인딩됩니다. 이 예제 Result 에서 인수는 두 개의 필수 인수와 함께 바인딩됩니다. 인수를 Result 바인딩할 필요가 없으며 그렇지 않은 경우 유효성 검사 오류가 발생하지 않습니다. 워크플로 작성자가 해당 값이 워크플로의 다른 곳에서 사용되는 경우 바인딩 Result 해야 합니다.
new Add
{
Operand1 = Operand1,
Operand2 = Operand2,
Result = Result
}
루트 작업에서 필수 인수 유효성 검사
워크플로의 루트 활동에 인수가 있는 경우 워크플로가 호출되고 매개 변수가 워크플로에 전달될 때까지 바인딩되지 않습니다. 다음 워크플로는 유효성 검사를 통과하지만 다음 예제와 같이 필요한 인수를 전달하지 않고 워크플로를 호출하면 예외가 throw됩니다.
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: 루트 활동의 인수 설정이 잘못되었습니다.워크플로 정의를 수정하거나 입력 값을 제공하여 이러한 오류를 수정합니다.'Add': 필수 작업 인수 'Operand2'에 대한 값이 제공되지 않았습니다.'Add': 필수 작업 인수 'Operand1'에 대한 값이 제공되지 않았습니다. 올바른 인수가 전달되면 다음 예제와 같이 워크플로가 성공적으로 완료됩니다.
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);
}
비고
이 예제에서는 이전 예제와 달리 루트 활동이 Activity로 선언되지 않고 Add로 선언되었습니다. 이렇게 하면 이 WorkflowInvoker.Invoke 메서드는 out 인수 사전 대신 Add 작업의 결과를 나타내는 단일 정수 값을 반환할 수 있습니다. 변수 wf는 Activity<int>로 선언될 수도 있습니다.
루트 인수의 유효성을 검사할 때 워크플로가 호출될 때 필요한 모든 인수가 전달되도록 하는 것은 호스트 애플리케이션의 책임입니다.
명령형 코드 기반 유효성 검사 호출
명령적 코드 기반 유효성 검사는 활동에서 자체에 대한 유효성 검사를 제공하는 간단한 방법을 제공하며 , CodeActivityAsyncCodeActivity및 에서 NativeActivity파생되는 활동에 사용할 수 있습니다. 유효성 검사 오류 또는 경고를 결정하는 유효성 검사 코드가 활동에 추가됩니다. 작업에서 유효성 검사를 호출하면 이러한 경고 또는 오류가 호출 Validate에서 반환된 컬렉션에 포함됩니다. 다음 예제에서는 CreateProduct 활동이 정의됩니다.
Cost가 Price보다 크면, CacheMetadata 재정의의 메타데이터에 유효성 검사 오류가 추가됩니다.
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.
}
}
이 예제에서는 활동 CreateProduct를 사용하여 워크플로를 구성합니다. 이 워크플로에서 이 Cost 인수는 보다 Price크며 필수 Description 인수는 설정되지 않았습니다. 유효성 검사가 호출되면 다음 오류가 반환됩니다.
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);
}
}
오류: 비용은 가격보다 작거나 같아야 합니다.오류: 필수 작업 인수 'Description'에 대한 값이 제공되지 않았습니다.
비고
사용자 정의 활동 작성자는 활동의 CacheMetadata 재정의 메서드에서 유효성 검사 논리를 제공할 수 있습니다. CacheMetadata에서 throw된 모든 예외는 유효성 검사 오류로 처리되지 않습니다. 이러한 예외는 호출 Validate 에서 이스케이프되며 호출자가 처리해야 합니다.
ValidationSettings 기능 사용
기본적으로 활동 트리의 모든 활동은 유효성 검사가 호출될 때 평가됩니다 ActivityValidationServices.
ValidationSettings 에서는 세 가지 속성을 구성하여 여러 가지 방법으로 유효성 검사를 사용자 지정할 수 있습니다.
SingleLevel 는 유효성 검사기가 전체 활동 트리를 걸어야 하는지 아니면 제공된 활동에만 유효성 검사 논리를 적용해야 하는지 여부를 지정합니다. 이 값의 기본값은 .입니다 false.
AdditionalConstraints 는 형식에서 제약 조건 목록으로의 추가 제약 조건 매핑을 지정합니다. 활동 트리에서 각 활동의 기본 유형을 유효성 검사할 때 AdditionalConstraints를 조회합니다. 일치하는 제약 조건 목록이 있으면 목록의 모든 제약 조건이 활동에 대해 평가됩니다.
OnlyUseAdditionalConstraints 는 유효성 검사기가 모든 제약 조건을 평가해야 하는지 아니면 에 지정된 AdditionalConstraints제약 조건만 평가해야 하는지를 지정합니다. 기본값은 false입니다.
AdditionalConstraints
OnlyUseAdditionalConstraints 는 워크플로 호스트 작성자가 FxCop과 같은 도구에 대한 정책 제약 조건과 같은 워크플로에 대한 추가 유효성 검사를 추가하는 데 유용합니다. 제약 조건에 대한 자세한 내용은 선언적 제약 조건을 참조하세요.
ValidationSettings을(를) 사용하려면 원하는 속성을 구성한 후, Validate 호출 시 전달합니다. 이 예제에서는 사용자 지정 Add 활동이 포함된 Sequence 워크플로의 유효성을 검사합니다.
Add 이 활동에는 두 개의 필수 인수가 있습니다.
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);
}
}
다음 Add 작업은 A Sequence에 사용되지만 두 개의 필수 인수는 바인딩되지 않습니다.
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))
}
}
};
다음 예제에서는 SingleLevel이 true로 설정되어 있기 때문에, 루트 Sequence 활동만 유효성 검사가 수행됩니다.
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);
}
}
이 코드는 다음 출력을 표시합니다.
경고 또는 오류 없음 활동에 바인딩되지 않은 필수 인수가 있더라도 Add 루트 활동만 평가되므로 유효성 검사가 성공합니다. 이 유형의 유효성 검사는 디자이너에서 단일 활동의 속성 변경 유효성 검사와 같은 활동 트리의 특정 요소만 유효성을 검사하는 데 유용합니다. 이 워크플로가 호출되면 워크플로에 구성된 전체 유효성 검사가 평가되어, 그 결과 InvalidWorkflowException 예외가 발생할 수 있습니다.
ActivityValidationServices 및 ValidationSettings 호스트에서 명시적으로 호출한 유효성 검사만 구성하고 워크플로를 호출할 때 발생하는 유효성 검사는 구성하지 않습니다.
.NET