다음을 통해 공유


선언적 제약 조건

선언적 제약 조건은 활동 및 다른 활동과의 관계에 대한 강력한 유효성 검사 방법을 제공합니다. 제약 조건은 작성 프로세스 중에 작업에 대해 구성되지만 워크플로 호스트에서 추가 제약 조건을 지정할 수도 있습니다. 이 항목에서는 선언적 제약 조건을 사용하여 활동 유효성 검사를 제공하는 방법에 대한 개요를 제공합니다.

선언적 제약 조건 사용

제약 조건은 유효성 검사 논리를 포함하는 작업입니다. 이 제약 조건 작업은 코드 또는 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 메서드는 이 요구 사항을 적용하는 제약 조건을 반환합니다. GetParentGetParentChain 활동과 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);  
    }  
}  

OnlyUseAdditionalConstraintsValidationSettings 속성이 true이면, Validate를 호출하여 유효성 검사를 수행할 때 지정된 추가 제약 조건만 평가됩니다. 이는 특정 유효성 검사 구성에 대한 워크플로를 검사하는 데 유용할 수 있습니다. 그러나 워크플로가 호출되면 워크플로에 구성된 유효성 검사 논리가 평가되고 워크플로가 성공적으로 시작되도록 전달해야 합니다. 유효성 검사 호출에 대한 자세한 내용은 작업 유효성 검사 호출을 참조하세요.