선언적 제약 조건은 활동 및 다른 활동과의 관계에 대한 강력한 유효성 검사 방법을 제공합니다. 제약 조건은 작성 프로세스 중에 작업에 대해 구성되지만 워크플로 호스트에서 추가 제약 조건을 지정할 수도 있습니다. 이 항목에서는 선언적 제약 조건을 사용하여 활동 유효성 검사를 제공하는 방법에 대한 개요를 제공합니다.
선언적 제약 조건 사용
제약 조건은 유효성 검사 논리를 포함하는 작업입니다. 이 제약 조건 작업은 코드 또는 XAML에서 작성할 수 있습니다. 제약 조건 활동을 만든 후 활동 작성자는 유효성을 검사하기 위해 Constraints 활동의 속성에 이 제약 조건을 추가하거나 인스턴스의 AdditionalConstraints 속성을 사용하여 ValidationSettings 추가 유효성 검사를 제공하기 위해 제약 조건을 사용합니다. 유효성 검사 논리는 활동의 메타데이터 유효성 검사와 같은 간단한 유효성 검사로 구성될 수 있지만 현재 활동의 부모, 자식 및 형제 활동 관계를 고려하는 유효성 검사를 수행할 수도 있습니다. 제약 조건은 Constraint<T> 활동을 사용하여 작성됩니다. 유효성 검사 오류 및 경고를 만들고 워크플로의 관련 활동에 대한 정보를 제공하기 위해 몇 가지 추가적인 유효성 검사 활동이 제공됩니다.
AssertValidation 및 AddValidationError
활동은 AssertValidation 해당 Assertion 속성에서 참조하는 식을 평가하며, 식의 평가 결과가 false
일 경우 유효성 검사 오류 또는 경고가 ValidationResults에 추가됩니다. 이 속성은 Message 유효성 검사 오류를 IsWarning 설명하고 이 속성은 유효성 검사 실패가 오류인지 경고인지를 나타냅니다.
IsWarning 의 기본값은 false
입니다.
다음 예제에서는 유효성을 검사하는 작업의 길이가 2자 이하인 경우 DisplayName 유효성 검사 경고를 반환하는 제약 조건이 선언됩니다. 사용되는 Constraint<T> 제네릭 형식 매개 변수는 제약 조건에 의해 유효성을 검사하는 작업의 형식을 지정합니다. 이 제약 조건은 제네릭 형식으로 사용 Activity 되며 모든 유형의 활동의 유효성을 검사하는 데 사용할 수 있습니다.
public static Constraint ActivityDisplayNameIsNotSetWarning()
{
DelegateInArgument<Activity> element = new DelegateInArgument<Activity>();
return new Constraint<Activity>
{
Body = new ActivityAction<Activity, ValidationContext>
{
Argument1 = element,
Handler = new AssertValidation
{
IsWarning = true,
Assertion = new InArgument<bool>(env => (element.Get(env).DisplayName.Length > 2)),
Message = new InArgument<string>("It is a best practice to have a DisplayName of more than 2 characters."),
}
}
};
}
활동에 대해 이 제약 조건을 지정하려면 다음 예제 코드와 같이 활동의 제약 조건에 추가 Constraints 됩니다.
public sealed class SampleActivity : CodeActivity
{
public SampleActivity()
{
base.Constraints.Add(ActivityDisplayNameIsNotSetWarning());
}
// Activity implementation omitted.
}
호스트는 다음 섹션에서 설명하는 를 사용하여 AdditionalConstraints워크플로의 활동에 대해 이 제약 조건을 지정할 수도 있습니다.
이 AddValidationError 작업은 식의 평가 없이 유효성 검사 오류 또는 경고를 생성하는 데 사용됩니다. 그 속성은 AssertValidation과 유사하며, If 활동과 같은 제약 조건의 흐름 제어 활동과 함께 사용할 수 있습니다.
워크플로 관계 활동
유효성을 검사하는 활동과 관련하여 워크플로의 다른 활동에 대한 정보를 제공하는 여러 유효성 검사 활동을 사용할 수 있습니다. GetParentChain 는 현재 활동과 루트 활동 사이의 모든 활동을 포함하는 활동 컬렉션을 반환합니다. GetChildSubtree 는 재귀 패턴의 자식 활동을 포함하는 활동 컬렉션을 제공하고 GetWorkflowTree 워크플로의 모든 활동을 가져옵니다.
다음 예제에서는 CreateState
활동을 정의합니다.
CreateState
활동은 CreateCountry
활동 내에 포함되어야 하며, GetParent
메서드는 이 요구 사항을 적용하는 제약 조건을 반환합니다.
GetParent
는 GetParentChain 활동과 ForEach<T> 활동을 함께 사용하여 CreateState
활동의 부모 활동을 검사하고 요구 사항이 충족되는지 판단합니다.
public sealed class CreateState : CodeActivity
{
public CreateState()
{
base.Constraints.Add(CheckParent());
this.Cities = new List<Activity>();
}
public List<Activity> Cities { get; set; }
public string Name { get; set; }
static Constraint CheckParent()
{
DelegateInArgument<CreateState> element = new DelegateInArgument<CreateState>();
DelegateInArgument<ValidationContext> context = new DelegateInArgument<ValidationContext>();
Variable<bool> result = new Variable<bool>();
DelegateInArgument<Activity> parent = new DelegateInArgument<Activity>();
return new Constraint<CreateState>
{
Body = new ActivityAction<CreateState,ValidationContext>
{
Argument1 = element,
Argument2 = context,
Handler = new Sequence
{
Variables =
{
result
},
Activities =
{
new ForEach<Activity>
{
Values = new GetParentChain
{
ValidationContext = context
},
Body = new ActivityAction<Activity>
{
Argument = parent,
Handler = new If()
{
Condition = new InArgument<bool>((env) => object.Equals(parent.Get(env).GetType(),typeof(CreateCountry))),
Then = new Assign<bool>
{
Value = true,
To = result
}
}
}
},
new AssertValidation
{
Assertion = new InArgument<bool>(result),
Message = new InArgument<string> ("CreateState has to be inside a CreateCountry activity"),
}
}
}
}
};
}
protected override void Execute(CodeActivityContext context)
{
// not needed for the sample
}
}
추가 제약 조건
워크플로 호스트 작성자는 제약 조건을 만들고 인스턴스 사전에 추가하여 AdditionalConstraints 워크플로의 ValidationSettings 활동에 대한 추가 유효성 검사 제약 조건을 지정할 수 있습니다. 각 항목 AdditionalConstraints 에는 제약 조건이 적용되는 작업 유형과 해당 활동 유형에 대한 추가 제약 조건 목록이 포함됩니다. 워크플로에 대한 유효성 검사가 호출되면 파생 클래스를 포함하여 지정된 형식의 각 활동이 제약 조건을 평가합니다. 이 예제에서는 이전 섹션의 ActivityDisplayNameIsNotSetWarning
제약 조건이 워크플로의 모든 활동에 적용됩니다.
Activity wf = new Sequence
{
// Workflow Details Omitted.
};
ValidationSettings settings = new ValidationSettings()
{
AdditionalConstraints =
{
{typeof(Activity), new List<Constraint> {ActivityDisplayNameIsNotSetWarning()}},
}
};
// Validate the workflow.
ValidationResults results = ActivityValidationServices.Validate(wf, settings);
// Evaluate the results.
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 in " + error.Source.DisplayName + ": " + error.Message);
}
foreach (ValidationError warning in results.Warnings)
{
Console.WriteLine("Warning in " + warning.Source.DisplayName + ": " + warning.Message);
}
}
OnlyUseAdditionalConstraints의 ValidationSettings 속성이 true
이면, Validate를 호출하여 유효성 검사를 수행할 때 지정된 추가 제약 조건만 평가됩니다. 이는 특정 유효성 검사 구성에 대한 워크플로를 검사하는 데 유용할 수 있습니다. 그러나 워크플로가 호출되면 워크플로에 구성된 유효성 검사 논리가 평가되고 워크플로가 성공적으로 시작되도록 전달해야 합니다. 유효성 검사 호출에 대한 자세한 내용은 작업 유효성 검사 호출을 참조하세요.
.NET