작업 1: ConditionedActivityGroup 활동 만들기
ConditionedActivityGroup 활동은 특정 조건이 충족될 때까지 포함된 모든 자식 활동을 실행하는 데 사용됩니다. 또한 각 자식 활동이 현재 반복 중에 실행될지 여부를 결정하기 위한 조건이 해당 자식 활동에 포함될 수도 있습니다.
이 작업에서는 큐에 쿠폰이 더 이상 없을 때까지 해당하는 모든 자식 활동을 실행하는 ConditionedActivityGroup 활동을 만듭니다. CodeActivity 활동은 ConditionedActivityGroup 활동의 마지막 자식으로 사용되고 큐에서 첫 번째 쿠폰을 제거합니다. 이 프로세스는 모든 쿠폰이 사용될 때까지 반복됩니다.
참고
이 연습을 차례대로 수행하는 것이 좋지만 반드시 그럴 필요는 없습니다. 샘플 프로젝트를 열고 다음 단원의 단계를 진행하여 이 연습을 시작할 수 있습니다.
ConditionedActivityGroup을 만들려면
DiscountWorkflow 클래스에서 conditionedActivityGroup1이라는 private ConditionedActivityGroup 변수를 만듭니다. 이 ConditionedActivityGroup 활동은 Coupons 컬렉션의 모든 쿠폰을 반복하고 컬렉션에 쿠폰이 남아 있지 않을 때까지 쿠폰 논리를 할인 필드에 적용합니다.
this.conditionedActivityGroup1 = new System.Workflow.Activities.ConditionedActivityGroup();
DiscountWorkflow 클래스의 InitializeComponent 메서드에서 이전 단계에서 선언한 ConditionedActivityGroup 개체의 새 인스턴스를 만듭니다.
이 인스턴스는 메서드의 시작 부분에서 CanModifyActivities 속성을 true로 설정하는 코드 뒤에 추가되어야 합니다.
RuleConditionReference ruleconditionreference2 = new RuleConditionReference(); RuleConditionReference ruleconditionreference3 = new RuleConditionReference();
InitializeComponent 메서드에서 ruleconditionreference2 및 ruleconditionreference3이라는 두 지역 RuleConditionReference 변수를 만들고 각 개체의 인스턴스를 만듭니다. ruleconditionreference2 매개 변수는 쿠폰이 Coupon 컬렉션에 있는지 확인하는 데 사용됩니다. 이 작업은 ConditionedActivityGroup의 UntilCondition 속성을 사용하여 규칙을 확인하는 방법으로 수행됩니다.
this.elseHasCoupons.Activities.Add(this.conditionedActivityGroup1);
InitializeComponent 메서드에서 Add 메서드를 사용하여 conditionedActivityGroup1 개체를 elseHasCoupons 개체의 Activities 컬렉션에 추가합니다.
이 작업은 elseHasCoupons 개체의 Name 속성을 설정하기 전에 수행해야 합니다.
this.conditionedActivityGroup1.Name = "conditionedActivityGroup1"; ruleconditionreference2.ConditionName = "noCouponsCondition"; this.conditionedActivityGroup1.UntilCondition = ruleconditionreference2;
conditionedActivityGroup1 개체의 Name을 "conditionedActivityGroup1" 값으로 설정합니다.
ruleconditionreference2 개체의 ConditionName 속성을 "noCouponsCondition"으로 설정합니다.
참고
다음 절차에서 noCouponsCondition 규칙을 만듭니다.
conditionedActivityGroup1 개체의 UntilCondition 속성을 ruleconditionreference2로 설정합니다.
private CodeActivity removeCoupon;
CodeActivity를 만들어 쿠폰을 제거하려면
DiscountWorkflow 클래스에서 removeCoupon이라는 private CodeActivity 변수를 만듭니다.
this.removeCoupon = new System.Workflow.Activities.CodeActivity();
DiscountWorkflow 클래스의 InitializeComponent 메서드에서 이전 단계에서 선언한 CodeActivity 개체의 새 인스턴스를 만듭니다.
이 인스턴스를 CanModifyActivities 속성을 설정하는 코드 뒤에 추가합니다.
this.conditionedActivityGroup1.Activities.Add(this.removeCoupon);
InitializeComponent 메서드에서 Add 메서드를 사용하여 removeCoupon 개체를 conditionedActivityGroup 개체의 Activities 컬렉션에 추가합니다.
이 작업은 conditionedActivityGroup1 개체의 Name 속성을 설정하기 전에 수행해야 합니다.
ruleconditionreference3.ConditionName = "couponsRemaining"; this.removeCoupon.Name = "removeCoupon";
InitializeComponent 메서드에서 conditionedActivityGroup1 개체의 UntilCondition을 설정하는 줄 뒤에서 ruleconditionreference3 개체의 ConditionName 속성을 "couponsRemaining"으로 설정합니다. 이렇게 하면 이 조건이 true인 동안 couponsRemaining CodeActivity가 실행됩니다.
참고
다음 절차에서 couponsRemaining 규칙을 만듭니다.
removeCoupon 개체의 Name 속성을 "removeCoupon" 값으로 설정합니다.
this.removeCoupon.ExecuteCode += new System.EventHandler(this.removeCoupon_ExecuteCode);
removeCoupon 개체에 정의된 ExecuteCode 이벤트에 이벤트 처리기를 추가합니다.
이벤트 처리기의 이름을 removeCoupon_ExecuteCode로 설정합니다.
this.removeCoupon.SetValue(ConditionedActivityGroup.WhenConditionProperty, ruleconditionreference3);
removeCoupon 개체에 정의된 SetValue 메서드를 호출하여 WhenConditionProperty 및 ruleconditionreference3 개체를 매개 변수로 전달합니다. WhenConditionProperty가 DependencyProperty이기 때문에 SetValue 메서드를 사용하여 ruleconditionreference3 개체와 연결합니다.
private void removeCoupon_ExecuteCode(object sender, EventArgs e) { this.Coupons.Dequeue(); }
DiscountWorkflow 클래스에서 removeCoupon_ExecuteCode라는 private 메서드를 만들어 sender라는 Object와 e라는 EventArgs 개체를 매개 변수로 전달합니다.
removeCoupon_ExecuteCode 메서드에서 Coupons 컬렉션에 정의된 Dequeue 메서드를 호출하여 Queue 컬렉션에서 쿠폰을 제거합니다.
private PolicyActivity couponPolicy;
CodeActivity When 규칙 만들기
이 작업의 ConditionedActivityGroup은 Queue 컬렉션에 쿠폰이 남아 있지 않을 때까지 모든 자식 활동을 실행합니다. 이 절차의 규칙을 적용하면 이전 작업에서 만든 CodeActivity 개체가 쿠폰이 Queue 컬렉션에 있는 경우에만 실행됩니다. 이전 절차에서 RuleConditionReference를 CodeActivity의 WhenCondition과 연결했습니다. 이 절차에서는 프로젝트의 규칙 파일에서 규칙을 정의합니다.
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
Copyright © 2007 by Microsoft Corporation. All rights reserved.