다음을 통해 공유


작업 5: OrderProcessing 상태 정의

이 작업에서는 OrderProcessingState를 정의하는 데 필요한 자식 활동을 추가합니다. 상태 시스템 워크플로에서 이 상태가 시작되면 간단한 주문 양식 호스트 응용 프로그램에서 주문이 이미 제출되었고 WaitingForOrderState가 해당 주문을 처리한 것입니다. WaitingForOrderState의 마지막 단계에서는 상태 시스템의 현재 상태를 이 작업에 정의된 OrderProcessingState 상태로 설정하는 SetStateActivity가 포함되었습니다.

참고

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

OrderProcessingState에 필요한 필드를 선언하려면

  1. OrderProcessingWorkflow 클래스에서 다음 표에 나와 있는 필드를 정의합니다.

    액세스 한정자 형식 이름

    Private

    StateInitializationActivity

    initializeOrderOpenStateActivity

    Private

    CallExternalMethodActivity

    invokeProcessingNewOrderStatusUpdate

    Private

    CallExternalMethodActivity

    invokeOrderProcessedStatusUpdate

    Private

    SetStateActivity

    setStateActivityOrderCompleted

    // OrderProcessingStateActivity Activities
    private StateInitializationActivity initializeOrderOpenStateActivity;
    private CallExternalMethodActivity invokeProcessingNewOrderStatusUpdate;
    private CallExternalMethodActivity invokeOrderProcessedStatusUpdate;
    private SetStateActivity setStateActivityOrderCompleted;
    
  2. InitializeComponent 메서드에서 이전 단계에서 만든 필드의 인스턴스를 만듭니다.

    // OrderProcessingStateActivity Activities
    this.initializeOrderOpenStateActivity = new StateInitializationActivity();
    this.invokeProcessingNewOrderStatusUpdate = new CallExternalMethodActivity();
    this.invokeOrderProcessedStatusUpdate = new CallExternalMethodActivity();
    this.setStateActivityOrderCompleted = new SetStateActivity();
    

OrderProcessingState 자식 활동을 정의하려면

  1. InitializeComponent 메서드에서 OrderProcessingStateActivity 개체의 Name 속성을 설정하는 줄 앞에서 initializeOrderOpenStateActivity 개체를 OrderProcessingStateActivity 개체의 Activities 컬렉션에 추가합니다.

  2. InitializeComponent 메서드에서 invokeProcessingNewOrderStatusUpdate, invokeOrderProcessedStatusUpdatesetStateActivityOrderCompleted 개체를 initializeOrderOpenStateActivityActivities 컬렉션에 추가합니다.

    참고

    이 단계에서 설명한 동일한 순서로 이러한 개체를 추가합니다.

    // 
    // initializeOrderOpenStateActivity
    // 
    this.initializeOrderOpenStateActivity.Activities.Add
        (this.invokeProcessingNewOrderStatusUpdate);
    this.initializeOrderOpenStateActivity.Activities.Add
        (this.invokeOrderProcessedStatusUpdate);
    this.initializeOrderOpenStateActivity.Activities.Add
        (this.setStateActivityOrderCompleted);
    
  3. initializeOrderOpenStateActivityName 속성을 "initializeOrderOpenStateActivity" 값으로 설정합니다.

    this.initializeOrderOpenStateActivity.Name =
        "initializeOrderOpenStateActivity";
    
  4. invokeProcessingNewOrderStatusUpdate 활동의 InterfaceType 속성을 IOrderingService 형식으로 설정합니다.

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

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

    // 
    // invokeProcessingNewOrderStatusUpdate
    // 
    this.invokeProcessingNewOrderStatusUpdate.InterfaceType =
        typeof(IOrderingService);
    this.invokeProcessingNewOrderStatusUpdate.MethodName = "ItemStatusUpdate";
    
  6. workflowparameterbinding2 개체를 invokeProcessingNewOrderStatusUpdate 개체의 ParameterBindings 컬렉션에 추가합니다.

  7. workflowparameterbinding3 개체를 invokeProcessingNewOrderStatusUpdate 개체의 ParameterBindings 컬렉션에 추가합니다.

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

    this.invokeProcessingNewOrderStatusUpdate.MethodInvoking +=
        new System.EventHandler(this.ProcessNewOrder);
    
  9. invokeProcessingNewOrderStatusUpdate 개체의 Name 속성을 "invokeProcessingNewOrderStatusUpdate" 값으로 설정합니다.

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

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

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

    this.invokeOrderProcessedStatusUpdate.InterfaceType =
        typeof(IOrderingService);
    this.invokeOrderProcessedStatusUpdate.MethodName = "ItemStatusUpdate";
    
  12. workflowparameterbinding2 개체를 invokeOrderProcessedStatusUpdate 개체의 ParameterBindings 컬렉션에 추가합니다.

  13. workflowparameterbinding3 개체를 invokeOrderProcessedStatusUpdate 개체의 ParameterBindings 컬렉션에 추가합니다.

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

    this.invokeOrderProcessedStatusUpdate.MethodInvoking +=
        new System.EventHandler(this.FinalizeOrder);
    
  15. invokeOrderProcessedStatusUpdate 개체의 Name 속성을 "invokeOrderProcessedStatusUpdate" 값으로 설정합니다.

    this.invokeOrderProcessedStatusUpdate.Name =
        "invokeOrderProcessedStatusUpdate";
    
  16. setStateActivityOrderCompleted 활동의 Name 속성을 "setStateActivityOrderCompleted" 값으로 설정합니다.

  17. setStateActivityOrderCompleted 활동의 TargetStateName을 "OrderCompletedStateActivity" 값으로 설정합니다.

    // 
    // setStateActivityOrderCompleted
    // 
    this.setStateActivityOrderCompleted.Name =
        "setStateActivityOrderCompleted";
    this.setStateActivityOrderCompleted.TargetStateName =
        "OrderCompletedStateActivity";
    

새 주문을 호출하고 종결하는 CallExternalMethod 메서드를 정의하려면

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

  2. ProcessNewOrder 메서드에서 _itemStatus 필드를 "Processing order" 값으로 설정합니다.

    private void ProcessNewOrder(object sender, EventArgs e)
    {
        this.orderItemStatus = "Processing order";
    }
    
  3. sender라는 System.Object 메서드와 e라는 EventArgs 개체를 받아들이는 FinalizeOrder라는 새 private 메서드를 만듭니다.

  4. ProcessNewOrder 메서드에서 _itemStatus 필드를 "Order processed" 값으로 설정합니다.

    void FinalizeOrder(object sender, EventArgs e)
    {
        this.orderItemStatus = "Order processed";
    }
    

코드 컴파일

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

자습서의 완성된 버전을 보려면 상태 시스템 워크플로 총괄 자습서를 참조하십시오.

참고 항목

개념

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

기타 리소스

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

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.