다음을 통해 공유


작업 1: ConditionedActivityGroup 활동 만들기

ConditionedActivityGroup 활동은 특정 조건이 충족될 때까지 포함된 모든 자식 활동을 실행하는 데 사용됩니다. 또한 각 자식 활동이 현재 반복 중에 실행될지 여부를 결정하기 위한 조건이 해당 자식 활동에 포함될 수도 있습니다.

이 작업에서는 큐에 쿠폰이 더 이상 없을 때까지 해당하는 모든 자식 활동을 실행하는 ConditionedActivityGroup 활동을 만듭니다. CodeActivity 활동은 ConditionedActivityGroup 활동의 마지막 자식으로 사용되고 큐에서 첫 번째 쿠폰을 제거합니다. 이 프로세스는 모든 쿠폰이 사용될 때까지 반복됩니다.

참고

이 연습을 차례대로 수행하는 것이 좋지만 반드시 그럴 필요는 없습니다. 샘플 프로젝트를 열고 다음 단원의 단계를 진행하여 이 연습을 시작할 수 있습니다.

ConditionedActivityGroup을 만들려면

  1. DiscountWorkflow 클래스에서 conditionedActivityGroup1이라는 private ConditionedActivityGroup 변수를 만듭니다. 이 ConditionedActivityGroup 활동은 Coupons 컬렉션의 모든 쿠폰을 반복하고 컬렉션에 쿠폰이 남아 있지 않을 때까지 쿠폰 논리를 할인 필드에 적용합니다.

    this.conditionedActivityGroup1 =
        new System.Workflow.Activities.ConditionedActivityGroup();
    
  2. DiscountWorkflow 클래스의 InitializeComponent 메서드에서 이전 단계에서 선언한 ConditionedActivityGroup 개체의 새 인스턴스를 만듭니다.

    이 인스턴스는 메서드의 시작 부분에서 CanModifyActivities 속성을 true로 설정하는 코드 뒤에 추가되어야 합니다.

    RuleConditionReference ruleconditionreference2 = new
        RuleConditionReference();
    RuleConditionReference ruleconditionreference3 = new
        RuleConditionReference();
    
  3. InitializeComponent 메서드에서 ruleconditionreference2 및 ruleconditionreference3이라는 두 지역 RuleConditionReference 변수를 만들고 각 개체의 인스턴스를 만듭니다. ruleconditionreference2 매개 변수는 쿠폰이 Coupon 컬렉션에 있는지 확인하는 데 사용됩니다. 이 작업은 ConditionedActivityGroupUntilCondition 속성을 사용하여 규칙을 확인하는 방법으로 수행됩니다.

    this.elseHasCoupons.Activities.Add(this.conditionedActivityGroup1);
    
  4. InitializeComponent 메서드에서 Add 메서드를 사용하여 conditionedActivityGroup1 개체를 elseHasCoupons 개체의 Activities 컬렉션에 추가합니다.

    이 작업은 elseHasCoupons 개체의 Name 속성을 설정하기 전에 수행해야 합니다.

    this.conditionedActivityGroup1.Name = "conditionedActivityGroup1";
    ruleconditionreference2.ConditionName = "noCouponsCondition";
    this.conditionedActivityGroup1.UntilCondition = ruleconditionreference2;
    
  5. conditionedActivityGroup1 개체의 Name을 "conditionedActivityGroup1" 값으로 설정합니다.

  6. ruleconditionreference2 개체의 ConditionName 속성을 "noCouponsCondition"으로 설정합니다.

    참고

    다음 절차에서 noCouponsCondition 규칙을 만듭니다.

  7. conditionedActivityGroup1 개체의 UntilCondition 속성을 ruleconditionreference2로 설정합니다.

    private CodeActivity removeCoupon;
    

CodeActivity를 만들어 쿠폰을 제거하려면

  1. DiscountWorkflow 클래스에서 removeCoupon이라는 private CodeActivity 변수를 만듭니다.

    this.removeCoupon = new System.Workflow.Activities.CodeActivity();
    
  2. DiscountWorkflow 클래스의 InitializeComponent 메서드에서 이전 단계에서 선언한 CodeActivity 개체의 새 인스턴스를 만듭니다.

    이 인스턴스를 CanModifyActivities 속성을 설정하는 코드 뒤에 추가합니다.

    this.conditionedActivityGroup1.Activities.Add(this.removeCoupon);
    
  3. InitializeComponent 메서드에서 Add 메서드를 사용하여 removeCoupon 개체를 conditionedActivityGroup 개체의 Activities 컬렉션에 추가합니다.

    이 작업은 conditionedActivityGroup1 개체의 Name 속성을 설정하기 전에 수행해야 합니다.

    ruleconditionreference3.ConditionName = "couponsRemaining";
    this.removeCoupon.Name = "removeCoupon";
    
  4. InitializeComponent 메서드에서 conditionedActivityGroup1 개체의 UntilCondition을 설정하는 줄 뒤에서 ruleconditionreference3 개체의 ConditionName 속성을 "couponsRemaining"으로 설정합니다. 이렇게 하면 이 조건이 true인 동안 couponsRemaining CodeActivity가 실행됩니다.

    참고

    다음 절차에서 couponsRemaining 규칙을 만듭니다.

  5. removeCoupon 개체의 Name 속성을 "removeCoupon" 값으로 설정합니다.

    this.removeCoupon.ExecuteCode += new
        System.EventHandler(this.removeCoupon_ExecuteCode);
    
  6. removeCoupon 개체에 정의된 ExecuteCode 이벤트에 이벤트 처리기를 추가합니다.

    이벤트 처리기의 이름을 removeCoupon_ExecuteCode로 설정합니다.

    this.removeCoupon.SetValue(ConditionedActivityGroup.WhenConditionProperty,
        ruleconditionreference3);
    
  7. removeCoupon 개체에 정의된 SetValue 메서드를 호출하여 WhenConditionPropertyruleconditionreference3 개체를 매개 변수로 전달합니다. WhenConditionPropertyDependencyProperty이기 때문에 SetValue 메서드를 사용하여 ruleconditionreference3 개체와 연결합니다.

    private void removeCoupon_ExecuteCode(object sender, EventArgs e)
    {
        this.Coupons.Dequeue();
    }
    
  8. DiscountWorkflow 클래스에서 removeCoupon_ExecuteCode라는 private 메서드를 만들어 sender라는 Objecte라는 EventArgs 개체를 매개 변수로 전달합니다.

  9. removeCoupon_ExecuteCode 메서드에서 Coupons 컬렉션에 정의된 Dequeue 메서드를 호출하여 Queue 컬렉션에서 쿠폰을 제거합니다.

    private PolicyActivity couponPolicy;
    

CodeActivity When 규칙 만들기

이 작업의 ConditionedActivityGroupQueue 컬렉션에 쿠폰이 남아 있지 않을 때까지 모든 자식 활동을 실행합니다. 이 절차의 규칙을 적용하면 이전 작업에서 만든 CodeActivity 개체가 쿠폰이 Queue 컬렉션에 있는 경우에만 실행됩니다. 이전 절차에서 RuleConditionReferenceCodeActivityWhenCondition과 연결했습니다. 이 절차에서는 프로젝트의 규칙 파일에서 규칙을 정의합니다.

CodeActivity when 규칙을 만들려면

  • DiscountWorkflow.rules 파일에서 다음 규칙을 RuleDefinitions.Conditions 요소의 자식으로 추가합니다. 이 규칙에서는 Coupons Queue 컬렉션의 Count 속성을 확인하여 해당 컬렉션에 처리할 항목이 있는지 확인하기 위해 System.CodeDom 네임스페이스에 정의된 형식을 사용합니다.

    <RuleExpressionCondition Name="couponsRemaining">
        <RuleExpressionCondition.Expression>
            <ns0:CodeBinaryOperatorExpression Operator="GreaterThan" xmlns:ns0="clr-namespace:System.CodeDom;Assembly=System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
                <ns0:CodeBinaryOperatorExpression.Left>
                    <ns0:CodePropertyReferenceExpression PropertyName="Count">
                        <ns0:CodePropertyReferenceExpression.TargetObject>
                            <ns0:CodePropertyReferenceExpression PropertyName="Coupons">
                                <ns0:CodePropertyReferenceExpression.TargetObject>
                                    <ns0:CodeThisReferenceExpression />
                                </ns0:CodePropertyReferenceExpression.TargetObject>
                            </ns0:CodePropertyReferenceExpression>
                        </ns0:CodePropertyReferenceExpression.TargetObject>
                    </ns0:CodePropertyReferenceExpression>
                </ns0:CodeBinaryOperatorExpression.Left>
                <ns0:CodeBinaryOperatorExpression.Right>
                    <ns0:CodePrimitiveExpression>
                        <ns0:CodePrimitiveExpression.Value>
                            <ns1:Int32 xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">0</ns1:Int32>
                        </ns0:CodePrimitiveExpression.Value>
                    </ns0:CodePrimitiveExpression>
                </ns0:CodeBinaryOperatorExpression.Right>
            </ns0:CodeBinaryOperatorExpression>
        </RuleExpressionCondition.Expression>
    </RuleExpressionCondition>
    

코드 컴파일

코드 컴파일에 대한 자세한 내용은 코드 컴파일을 참조하십시오.

작업 2: PolicyActivity 및 RuleSet 만들기에서는 단일 PolicyActivity 활동을 추가합니다. 이 활동은 각 쿠폰 유형에 해당하는 규칙 집합을 사용하고 PolicyActivity를 만들어 각각의 개별 쿠폰에 대한 논리를 수행하는 규칙을 실행합니다.

참고 항목

작업

작업 2: PolicyActivity 및 RuleSet 만들기

참조

ConditionedActivityGroup
UntilCondition
RuleConditionReference
ConditionName
Activities
WhenConditionProperty
SetValue

기타 리소스

IfElse With Rules
Rules and Conditions

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.