다음을 통해 공유


작업 4: WaitingForOrder 상태 정의

이 작업에서는 몇 가지 자식 활동을 추가하여 OrderProcessingWorkflow에서 첫 번째 상태를 정의합니다.

이 상태는 상태 시스템 워크플로의 초기 상태이며 이벤트 구동 상태이므로 이전의 두 작업에서 선언되고 정의된 NewOrder 이벤트가 간단한 주문 양식 호스트 응용 프로그램에서 발생할 때까지 기다립니다. NewOrder 이벤트가 발생하면 OrderProcessingWorkflow는 호스트 응용 프로그램에 상태 메시지를 보냅니다. 이 메시지는 주문을 받았음을 나타냅니다.

마지막 단계는 SetStateActivity를 사용하여 상태 시스템의 다음 단계로 전환하는 것입니다.

참고

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

워크플로 필드 및 속성 선언

새 OrderProcessingWorkflow 필드 및 속성을 선언하려면

  1. OrderProcessingWorkflow 클래스에서 다음 표의 필드를 만듭니다.

    액세스 한정자 형식 이름

    Private

    EventDrivenActivity

    eventDriven1

    Private

    HandleExternalEventActivity

    newOrderExternalEvent

    Private

    CallExternalMethodActivity

    updatestatusOrderReceived

    Private

    SetStateActivity

    setStateActivityOrderProcessing

    Public

    NewOrderEventArgs

    receivedOrderDetails

    Public

    Guid

    orderId

    Private

    String

    orderItem

    Private

    Int32

    orderQuantity

    Public

    String

    orderIemStatus

    // WaitingForOrderStateActivity Activities
    private EventDrivenActivity eventDriven1;
    private HandleExternalEventActivity newOrderExternalEvent;
    private CallExternalMethodActivity updatestatusOrderReceived;
    private SetStateActivity setStateActivityOrderProcessing;
    public NewOrderEventArgs receivedOrderDetails = null;
    
    public Guid orderId;
    private string orderItem;
    private int orderQuantity;
    public string orderItemStatus;
    
  2. Id라는 System.Guid 속성을 만들고 orderId 필드의 값을 반환하는 get 메서드를 정의합니다.

    public Guid Id
    {
        get
        {
            return this.orderId;
        }
    }
    
  3. ItemStatus라는 System.String 속성을 만들고 orderItemStatus 필드의 값을 반환하는 get 메서드를 정의합니다.

    public string ItemStatus
    {
        get
        {
            return this.orderItemStatus;
        }
    }
    
  4. Item이라는 System.String 속성을 만들고 orderItem 필드의 값을 반환하는 get 메서드를 정의합니다.

    public string Item
    {
        get
        {
            return this.orderItem;
        }
    }
    

자식 활동 정의 및 메서드 만들기

다음 작업으로, WaitingForOrderState를 정의하는 몇 가지 자식 활동을 추가합니다. SetStateActivity를 사용하여 상태 시스템의 다음 단계로 전환합니다.

WaitingForOrderState 자식 활동을 정의하려면

  1. OrderProcessingWorkflow 클래스의 InitializeComponent 메서드에서 다음 표의 지역 변수를 선언하고 각 지역 변수의 인스턴스를 만듭니다.

    참고

    이러한 변수는 CanModifyActivities 속성을 true로 설정하는 코드 뒤에 선언되어야 합니다.

    형식 이름

    ActivityBind

    activitybind1

    ActivityBind

    activitybind2

    ActivityBind

    activitybind3

    WorkflowParameterBinding

    workflowparameterbinding1

    WorkflowParameterBinding

    workflowparameterbinding2

    WorkflowParameterBinding

    workflowparameterbinding3

    ActivityBind activitybind1 = new ActivityBind();
    ActivityBind activitybind2 = new ActivityBind();
    ActivityBind activitybind3 = new ActivityBind();
    WorkflowParameterBinding workflowparameterbinding1 =
        new WorkflowParameterBinding();
    WorkflowParameterBinding workflowparameterbinding2 =
        new WorkflowParameterBinding();
    WorkflowParameterBinding workflowparameterbinding3 =
        new WorkflowParameterBinding();
    
  2. 상태 시스템의 세 상태를 만드는 코드 뒤에 eventDriven1, newOrderExternalEvent, updateStatusOrderReceivedsetStateActivityOrderProcessing 개체의 인스턴스를 만듭니다.

    // WaitingForOrderStateActivity child activities
    this.eventDriven1 = new EventDrivenActivity();
    this.newOrderExternalEvent = new HandleExternalEventActivity();
    this.updatestatusOrderReceived = new CallExternalMethodActivity();
    this.setStateActivityOrderProcessing = new SetStateActivity();
    
  3. eventDriven1 개체를 WaitingForOrderStateActivity의 Activities 컬렉션에 추가합니다.

    Activities 컬렉션에 정의된 Add 메서드를 사용하고 eventDriven1 개체를 매개 변수로 전달합니다. 이 부분은 WaitingForOrderStateActivity를 초기화하는 코드 뒤에 추가되어야 합니다.

    this.WaitingForOrderStateActivity.Activities.Add(this.eventDriven1);
    
  4. OrderCompletedStateActivityName 속성을 설정하는 코드 뒤에서 newOrderExternalEvent, updateStatusOrderReceivedsetStateActivityOrderCompleted 활동을 eventDriven1 활동의 Activities 컬렉션에 추가합니다.

    참고

    이 단계에서 설명한 순서대로 활동을 추가해야 합니다.

  5. eventDriven1 활동의 Name 속성을 "eventDriven1" 값으로 설정합니다.

    // 
    // eventDriven1
    // 
    this.eventDriven1.Activities.Add(this.newOrderExternalEvent);
    this.eventDriven1.Activities.Add(this.updatestatusOrderReceived);
    this.eventDriven1.Activities.Add(this.setStateActivityOrderProcessing);
    this.eventDriven1.Name = "eventDriven1";
    
  6. newOrderExternalEvent 개체의 EventName 속성을 "NewOrder" 값으로 설정합니다.

    이것은 IOrderingService에 정의된 이벤트 이름이며 newOrderExternalEvent가 호스트 응용 프로그램에서 기다리는 이벤트입니다.

  7. newOrderExternalEvent 활동의 InterfaceType 속성을 IOrderingService 형식으로 설정합니다.

    this.newOrderExternalEvent.EventName = "NewOrder";
    this.newOrderExternalEvent.InterfaceType = typeof(IOrderingService);
    
  8. activitybind1 개체의 Name 속성을 "OrderProcessingWorkflow"로 설정하고 activitybind1 개체의 Path 속성을 "receivedOrderDetails" 값으로 설정합니다.

    activitybind1.Name = "OrderProcessingWorkflow";
    activitybind1.Path = "receivedOrderDetails";
    
  9. workflowparameterbinding1 개체의 ParameterName 속성을 "e" 값으로 설정합니다.

  10. workflowparameterbinding1 개체의 SetBinding 메서드를 호출하여 정적 속성 ValuePropertyactivitybind1 개체를 매개 변수로 전달합니다.

  11. workflowparameterbinding1 개체를 newOrderExternalEvent 개체의 ParameterBindings 컬렉션에 추가합니다.

    workflowparameterbinding1.ParameterName = "e";
    workflowparameterbinding1.SetBinding(
        System.Workflow.ComponentModel.WorkflowParameterBinding.ValueProperty,
        ((System.Workflow.ComponentModel.ActivityBind)(activitybind1)));
    this.newOrderExternalEvent.ParameterBindings.Add(workflowparameterbinding1);
    
  12. newOrderExternalEvent 개체의 Name 속성을 "newOrderExternalEvent" 값으로 설정합니다.

    this.newOrderExternalEvent.Name = "newOrderExternalEvent";
    
  13. updatestatusOrderReceived 활동의 InterfaceType 속성을 IOrderingService 형식으로 설정합니다.

  14. updatestatusOrderReceived 개체의 MethodName 속성을 "ItemStatusUpdate" 값으로 설정합니다.

    이것은 IOrderingService에서 정의된 메서드 이름이며 호스트 응용 프로그램에서 구현됩니다.

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

    this.updatestatusOrderReceived.InterfaceType = typeof(IOrderingService);
    this.updatestatusOrderReceived.MethodName = "ItemStatusUpdate";
    this.updatestatusOrderReceived.Name = "updatestatusOrderReceived";
    
  16. activitybind2 개체의 Name 속성을 "OrderProcessingWorkflow"로 설정하고 activitybind2 개체의 Path 속성을 "orderId" 값으로 설정합니다.

    activitybind2.Name = "OrderProcessingWorkflow";
    activitybind2.Path = "orderId";
    
  17. workflowparameterbinding2 개체의 ParameterName 속성을 "orderId" 값으로 설정합니다.

  18. workflowparameterbinding2 개체의 SetBinding 메서드를 호출하여 정적 속성 ValuePropertyactivitybind2 개체를 매개 변수로 전달합니다.

    workflowparameterbinding2.ParameterName = "orderId";
    workflowparameterbinding2.SetBinding(WorkflowParameterBinding.ValueProperty,
        ((System.Workflow.ComponentModel.ActivityBind)(activitybind2)));
    
  19. activitybind3 개체의 Name 속성을 "OrderProcessingWorkflow"로 설정하고 activitybind3 개체의 Path 속성을 "orderItemStatus" 값으로 설정합니다.

    activitybind3.Name = "OrderProcessingWorkflow";
    activitybind3.Path = "orderItemStatus";
    
  20. workflowparameterbinding3 개체의 ParameterName 속성을 "newStatus" 값으로 설정합니다.

  21. workflowparameterbinding3 개체의 SetBinding 메서드를 호출하여 정적 속성 ValuePropertyactivitybind3 개체를 매개 변수로 전달합니다.

    workflowparameterbinding3.ParameterName = "newStatus";
    workflowparameterbinding3.SetBinding(WorkflowParameterBinding.ValueProperty,
        ((System.Workflow.ComponentModel.ActivityBind)(activitybind3)));
    
  22. workflowparameterbinding2 개체를 updateStatusOrderReceived 개체의 ParameterBindings 컬렉션에 추가합니다.

  23. workflowparameterbinding1 개체를 updateStatusOrderReceived 개체의 ParameterBindings 컬렉션에 추가합니다.

    this.updatestatusOrderReceived.ParameterBindings.Add
        (workflowparameterbinding2);
    this.updatestatusOrderReceived.ParameterBindings.Add
        (workflowparameterbinding3);
    
  24. updateStatusOrderReceived 개체의 MethodInvoking 이벤트에 대한 OrderReceived라는 이벤트 처리기를 추가합니다.

    this.updatestatusOrderReceived.MethodInvoking +=
        new System.EventHandler(this.OrderReceived);
    
  25. setStateActivityOrderProcessing 활동의 Name 속성을 "setStateActivityOrderProcessing" 값으로 설정합니다.

  26. setStateActivityOrderProcessing 활동의 TargetStateName을 "OrderProcessingStateActivity" 값으로 설정합니다.

    // 
    // setStateActivityOrderProcessing
    // 
    this.setStateActivityOrderProcessing.Name =
        "setStateActivityOrderProcessing";
    this.setStateActivityOrderProcessing.TargetStateName =
        "OrderProcessingStateActivity";
    

OrderReceived 메서드를 만들려면

  1. sender라는 System.Object 메서드와 e라는 EventArgs 개체를 받아들이는 OrderReceived라는 새 private 메서드를 만듭니다.

    private void OrderReceived(object sender, EventArgs e)
    
  2. OrderReceived 메서드에서 orderId 필드를 receivedOrderDetails 개체의 ItemId 속성으로 설정합니다.

  3. orderItem 필드를 receivedOrderDetails 개체의 Item 속성으로 설정합니다.

  4. orderQuantity 필드를 receivedOrderDetails 개체의 Quantity 속성으로 설정합니다.

    this.orderId = receivedOrderDetails.ItemId;
    this.orderItem = receivedOrderDetails.Item;
    this.orderQuantity = receivedOrderDetails.Quantity;
    
  5. orderItemStatus 필드를 "Received Order" 값으로 설정합니다.

    this.orderItemStatus = "Received order";
    

코드 컴파일

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

SetStateActivity 활동은 상태 시스템의 현재 상태를 OrderProcessingState로 설정합니다. 작업 5: OrderProcessing 상태 정의에서는 자식 활동을 추가하여 OrderProcessingState를 정의합니다.

참고 항목

작업

작업 5: OrderProcessing 상태 정의

참조

EventDrivenActivity
HandleExternalEventActivity
CallExternalMethodActivity
SetStateActivity
ActivityBind
WorkflowParameterBinding
SetBinding
MethodInvoking

개념

워크플로 및 응용 프로그램 통신
상태 시스템 워크플로

기타 리소스

자습서: 상태 시스템 워크플로 만들기
Communications
HostCommunication Sample
Ordering State Machine
Simple State Machine

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.