다음을 통해 공유


작업 3: IOrderingService 인터페이스 구현

이 작업에서는 간단한 주문 양식 호스트 응용 프로그램에서 인터페이스를 구현하여 작업 2에서 만든 IOrderingService 인터페이스를 사용합니다.

사용자가 새 주문을 제출하는 경우 OrderProcessingWorkflow에서 처리되는 NewOrder 이벤트가 호스트 응용 프로그램에서 발생합니다. OrderProcessingWorkflow는 IOrderingService의 ItemStatusUpdate 메서드를 호출한 다음 호스트 응용 프로그램에서 이 메서드를 호출하여 사용자 인터페이스를 업데이트합니다.

참고

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

인터페이스 구현

이전 작업에서 만든 인터페이스를 구현하려면 다음 단계를 따르십시오.

IOrderingService 인터페이스를 구현하려면

  1. Program 소스 파일에서, IOrderingService 인터페이스에서 MainForm 클래스를 파생시킵니다.

    Public Class MainForm : Inherits Form : Implements IOrderingService
    End Class
    
    public class MainForm : Form, IOrderingService
    {
    }
    
    public class MainForm : Form, IOrderingService
    
  2. MainForm 클래스에서 orderId라는 Guid와 newStatus라는 String을 매개 변수로 받아들이는 ItemStatusUpdate라는 새 public 메서드를 만듭니다.

    Public Sub ItemStatusUpdate(ByVal orderId As Guid, ByVal newStatus As String) Implements IOrderingService.ItemStatusUpdate
    End Sub
    
    public void ItemStatusUpdate(Guid orderId, string newStatus)
    {
    }
    
  3. MainForm 클래스에서 workflowRuntime이라는 private WorkflowRuntime 필드를 만들어 null(Visual Basic의 경우 Nothing)로 초기화합니다.

  4. MainForm 클래스에서 exchangeService라는 ExternalDataExchangeService 필드를 만들어 null(Visual Basic의 경우 Nothing)로 초기화합니다.

    private WorkflowRuntime workflowRuntime = null;
    private ExternalDataExchangeService exchangeService = null;
    
  5. MainForm 클래스에서 newOrderEvent라는 NewOrderEventArgs 형식의 제네릭 private EventHandler를 만듭니다.

  6. MainForm 클래스에서 NewOrder라는 NewOrderEventArgs 형식의 제네릭 public EventHandler 이벤트 속성을 만듭니다.

  7. NewOrder 이벤트 속성에서 add 및 remove 접근자를 만들어 newOrderEvent 이벤트에서 이벤트 처리기를 추가하고 제거합니다.

    private event EventHandler<NewOrderEventArgs> newOrderEvent;
    public event EventHandler<NewOrderEventArgs> NewOrder
    {
        add
        {
            newOrderEvent += value;
        }
        remove
        {
            newOrderEvent -= value;
        }
    }
    
  8. MainForm 생성자에서 orderHistory 개체의 인스턴스를 만드는 코드 뒤에 WorkflowRuntime 개체의 인스턴스를 만듭니다.

  9. 이전 단계에서 만든 코드 뒤에 ExternalDataExchangeService 개체의 인스턴스를 만듭니다.

  10. AddService 메서드를 호출하고 exchangeService 개체를 매개 변수로 전달하여 ExternalDataExchangeService 개체를 WorkflowRuntime 서비스에 추가합니다.

  11. AddService 메서드를 호출하고 this(Visual Basic의 경우 Me) 개체를 매개 변수로 전달하여 MainForm 개체를 ExternalDataExchangeService 서비스에 추가합니다.

  12. StartRuntime 메서드를 호출하여 WorkflowRuntime을 시작합니다.

    this.workflowRuntime = new WorkflowRuntime();
    this.exchangeService = new ExternalDataExchangeService();
    this.workflowRuntime.AddService(this.exchangeService);
    this.exchangeService.AddService(this);
    this.workflowRuntime.StartRuntime();
    

새 주문 처리 사용

다음 작업으로, 사용자가 Submit 단추를 클릭할 때 새 주문을 제출할 수 있도록 Windows Form 응용 프로그램을 수정합니다. 이렇게 하려면 OrderProcessingWorkflow의 인스턴스를 만들고 실행하여 새 주문을 처리하는 데 필요한 매개 변수를 전달합니다.

새 주문을 제출하려면

  1. submitButton_Click 메서드에서 item이라는 System.String 변수를 만들고 값을 itemsList 컨트롤의 SelectedItem 속성으로 설정합니다.

  2. quantity라는 System.Int32 변수를 만들고 값을 itemQuantity 컨트롤의 Value 속성으로 설정합니다.

    string item = this.itemsList.SelectedItem.ToString();
    int quantity = (int)this.itemQuantity.Value;
    
  3. orderWorkflow라는 System.Type 변수를 만들고 값을 OrderProcessingWorkflow 형식으로 설정합니다.

  4. workflowInstance라는 WorkflowInstance 변수를 만들고 값을 workflowRuntime 개체에 정의된 CreateWorkflow 메서드의 반환 값으로 설정합니다. orderWorkflow 개체를 CreateWorkflow 메서드 호출에 대한 매개 변수로 전달합니다.

    Type orderWorkflow = typeof(OrderProcessingWorkflow);
    WorkflowInstance workflowInstance = this.workflowRuntime.CreateWorkflow(orderWorkflow);
    
  5. System.String 형식의 새 제네릭 List 개체를 만들어 orderHistory Dictionary 컬렉션에 할당하고 workflowInstance 개체의 InstanceId를 키로 사용합니다.

  6. 이전 단계에서 만든 orderHistory 키 위치에 있는 값에 대해 Dictionary 클래스에 정의된 Add 메서드를 호출하여 값이 품목 이름인 System.String과 사용자가 제출한 주문 수량을 추가합니다.

    this.orderHistory[workflowInstance.InstanceId.ToString()] = new List<string>();
    this.orderHistory[workflowInstance.InstanceId.ToString()].Add
        ("Item: " + item + "; Quantity:" + quantity);
    
  7. workflowInstance 개체에 정의된 Start 메서드를 호출합니다.

  8. NewOrder 이벤트를 발생시켜 null(Visual Basic의 경우 Nothing)을 첫 번째 매개 변수로 전달하고 workflowInstance 개체의 InstanceId, item 변수 및 quantity 변수로 초기화된 새 NewOrderEventArgs 개체를 전달합니다.

    workflowInstance.Start();
    
    newOrderEvent(null, new NewOrderEventArgs(workflowInstance.InstanceId, item, quantity));
    

사용자 인터페이스 업데이트

마지막으로 상태 메시지를 사용하여 워크플로에서 사용자 인터페이스를 업데이트할 수 있도록 합니다.

상태 메시지를 사용하여 사용자 인터페이스를 업데이트하려면

  1. ItemStatusUpdate 메서드에서 ordersIdList 개체의 InvokeRequired 속성이 true인지 확인합니다.

    이 속성이 true이면 statusUpdate라는 새 ItemStatusUpdateDelegate 개체와 orderId 및 newStatus 매개 변수가 포함된 args라는 System.Object 배열을 만듭니다.

  2. MainForm 클래스의 Invoke 메서드를 호출하여 statusUpdateargs 개체를 매개 변수로 전달합니다.

    If Me.ordersIdList.InvokeRequired = True Then
        Dim statusUpdate As ItemStatusUpdateDelegate = _
            New ItemStatusUpdateDelegate(AddressOf ItemStatusUpdate)
        Dim args As Object() = New Object(1) {orderId, newStatus}
        Me.Invoke(statusUpdate, args)
    Else
    End If
    
    if (this.ordersIdList.InvokeRequired == true)
    {
        ItemStatusUpdateDelegate statusUpdate = 
            new ItemStatusUpdateDelegate(ItemStatusUpdate);
        object[] args = new object[2] { orderId, newStatus };
        this.Invoke(statusUpdate, args);
    }
    else
    {
    }
    

    참고

    다음 단계는 이전 단계에서 만든 InvokeRequiredIf 문의 Else 본문에 포함되어야 합니다.

  3. If 문을 만들어 orderId 매개 변수를 키로 사용하여 orderHistory 컬렉션에 값이 포함되어 있는지 확인합니다.

  4. 이전 단계에서 만든 If 문에서 추가되어 있는 newStatus 매개 변수의 값을 사용하여 orderHistory 컬렉션의 orderId 키에 있는 값을 현재 DateTime으로 설정합니다.

  5. 3단계에서 만든 If 문에서 중첩된 If 문을 만들어 ordersIdList의 Items 컬렉션에 orderId가 포함되어 있는지 확인합니다.

    그렇지 않으면 orderId의 값을 Items 컬렉션에 추가합니다.

  6. orderIdList의 SelectedItem 속성을 orderId 매개 변수의 System.String 값으로 설정합니다.

  7. orderStatus 개체의 Text 속성을 GetOrderHistory 메서드의 반환 값으로 설정합니다. orderId 개체의 System.String 값을 GetOrderHistory 메서드에 매개 변수로 전달합니다.

    if (this.orderHistory.ContainsKey(orderId.ToString()))
    {
        this.orderHistory[orderId.ToString()].Add
            (DateTime.Now + " - " + newStatus);
    
        // Update order status data UI info
        if (this.ordersIdList.Items.Contains(orderId.ToString()) == false)
        {
            this.ordersIdList.Items.Add(orderId.ToString());
        }
    
        this.ordersIdList.SelectedItem = orderId.ToString();
        this.orderStatus.Text = GetOrderHistory(orderId.ToString());
    }
    

코드 컴파일

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

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

참고 항목

작업

작업 4: WaitingForOrder 상태 정의

참조

WorkflowRuntime
StartRuntime
ExternalDataExchangeService
AddService
WorkflowInstance
InstanceId
Start

개념

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

기타 리소스

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

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.