다음을 통해 공유


작업 1: 사용자 지정 활동 만들기

이 자습서에서는 WebTearActivity 클래스를 만듭니다. 이 클래스는 Activity 클래스에서 파생됩니다.

사용자 지정 활동이 포함된 워크플로가 시작되면 Windows Workflow 런타임 엔진에서 재정의된 Execute 메서드를 호출하고 ActivityExecutionContext 개체를 매개 변수로 전달합니다.

WebTear 활동을 만들 때 활동이 처리를 완료하는 데 필요한 사용자 지정 데이터를 사용할 수 있게 하는 클래스의 DependencyProperty 개체를 만듭니다. 이 활동에서 사용되는 DependencyProperty 개체는 String 개체이며 웹 페이지 URL에 사용됩니다.

참고

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

Visual Studio에서 WebTear 사용자 지정 활동 소스 파일을 만들려면

  • 솔루션 탐색기에서 CustomActivity 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가를 클릭한 다음 새 항목을 클릭합니다. 클래스를 선택하고 이름을 WebTearActivity로 변경합니다.

텍스트 편집기를 사용하여 WebTear 사용자 지정 활동 소스 파일을 만들려면

  1. 프로젝트 디렉터리에서 WebTearActivity라는 새 파일을 만듭니다.

    C# 응용 프로그램을 만드는 경우 파일에 .cs 확장명을 지정하고 Visual Basic 응용 프로그램을 만드는 경우에는 파일에 .vb 확장명을 지정합니다.

  2. 주 프로젝트 파일(CustomActivity)의 마지막 ItemGroup 요소에서 새 Compile 요소를 추가합니다.

  3. Include라는 새 특성을 Compile 요소에 추가합니다.

  4. 1단계에서 만든 파일 이름을 특성 값으로 사용합니다.

  5. SubType이라는 새 자식 요소를 Compile 요소에 추가합니다.

    이 요소에 Component 값을 지정합니다. ItemGroup 노드는 다음 코드와 같이 나타납니다.

    <ItemGroup>
        <Compile Include="CustomActivityHost.vb">
          <SubType>Form</SubType>
        </Compile>
        <Compile Include="WebTearActivity.vb">
          <SubType>Component</SubType>
        </Compile>
        <Compile Include="WebTearWorkflow.vb">
          <SubType>Component</SubType>
        </Compile>
      </ItemGroup>
    
    <ItemGroup>
        <Compile Include="CustomActivityHost.cs">
          <SubType>Form</SubType>
        </Compile>
        <Compile Include="WebTearActivity.cs">
          <SubType>Component</SubType>
        </Compile>
        <Compile Include="WebTearWorkflow.cs">
          <SubType>Component</SubType>
        </Compile>
      </ItemGroup>
    

WebTearActivity 클래스를 선언하려면

  1. WebTearActivity 파일에서 다음 네임스페이스 지시문을 추가하여 워크플로에 필요한 형식을 가져옵니다.

    using System;
    using System.ComponentModel;
    using System.Workflow.ComponentModel;
    using System.Workflow.ComponentModel.Design;
    
  2. Activity에서 파생되는 Microsoft.Samples.Workflow.Tutorials.CustomActivity 네임스페이스에서 WebTearActivity라는 새 클래스를 만듭니다.

    Namespace Microsoft.Samples.Workflow.Tutorials.CustomActivity
        Public Class WebTearActivity : Inherits System.Workflow.ComponentModel.Activity
        End Class
    End Namespace
    
    namespace Microsoft.Samples.Workflow.Tutorials.CustomActivity
    {
        public class WebTearActivity : System.Workflow.ComponentModel.Activity
        {
        }
    }
    

PageFinished 이벤트를 정의하려면

  1. WebTearActivity 클래스에서 sender라는 Object 매개 변수와 e라는 PageFinishedEventArgs 매개 변수를 받아들이는 PageFinishedEventHandler라는 새 delegate를 만듭니다.

    참고

    3단게에서 PageFinishedEventArgs를 만듭니다.

    public delegate void PageFinishedEventHandler(object sender,
        PageFinishedEventArgs e);
    
  2. WebTearActivity 클래스에서 pageFinishedEvent라는 새 private PageFinishedEventHandler 이벤트를 만듭니다.

  3. WebTearActivity 클래스에서 PageFinished라는 public PageFinishedEventHandler 이벤트 속성을 만듭니다.

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

    private event PageFinishedEventHandler pageFinishedEvent;
    public event PageFinishedEventHandler PageFinished
    {
        add
        {
            pageFinishedEvent += value;
        }
        remove
        {
            pageFinishedEvent -= value;
        }
    }
    
  5. Microsoft.Samples.Workflow.Tutorials.CustomActivity 네임스페이스에서 PageFinishedEventArgs라는 새 클래스를 만듭니다.

    이 클래스는 WebTearActivity 클래스와 동일한 소스 파일에서 WebTearActivity 클래스 정의 뒤에 정의될 수 있습니다.

    Public Class PageFinishedEventArgs
    End Class
    
    public class PageFinishedEventArgs
    {
    }
    
  6. PageFinishedEventArgs 클래스에서 pageData라는 private String 필드를 선언합니다.

    private string pageData;
    
  7. PageFinishedEventArgs 클래스에서 Data라는 public String 속성을 만듭니다.

    이 속성에서 이전 단계에서 만든 pageData 필드의 값을 반환하는 get 메서드를 만듭니다.

    public string Data
    {
        get { return this.pageData; }
    }
    
  8. PageFinishedEventArgs 클래스에서 data라는 String 매개 변수를 받아들이는 public 생성자를 만듭니다.

    생성자의 본문에서 PageFinishedEventArgs 클래스에 정의된 pageData 필드를 data 매개 변수의 값으로 설정합니다.

    public PageFinishedEventArgs(string data)
    {
        this.pageData = data;
    }
    

URL DependencyProperty를 정의하려면

  1. WebTearActivity 클래스에서 UrlProperty라는 새 public static DependencyProperty 필드를 만듭니다.

    이 필드를 Register static 메서드의 반환 값으로 설정하고 "Url" 문자열, String 클래스의 형식 및 WebTearActivity 클래스의 형식을 매개 변수로 Register 메서드에 전달합니다.

    public static DependencyProperty UrlProperty =
                DependencyProperty.Register("Url",
                typeof(System.String),
                typeof(WebTearActivity));
    
  2. WebTearActivity 클래스에서 Url이라는 public 문자열 속성을 만듭니다.

  3. DesignerSerializationVisibilityAttributeWebTearActivity 클래스의 Url 속성에 적용하고 Visible 값을 DesignerSerializationVisibilityAttribute에 매개 변수로 전달합니다.

  4. BrowsableAttributeWebTearActvity 클래스의 Url 속성에 적용하고 trueBrowsableAttribute에 매개 변수로 전달합니다.

  5. DescriptionAttributeWebTearActvity 클래스의 Url 속성에 적용하고 "Url to download" 문자열을 DescriptionAttribute에 매개 변수로 전달합니다.

  6. CategoryAttributeWebTearActvity 클래스의 Url 속성에 적용하고 "WebTearActivity Property" 문자열을 CategoryAttribute에 매개 변수로 전달합니다.

  7. Url 속성에 대한 get 메서드를 정의합니다.

  8. get 메서드 본문에서 GetValue 기본 클래스 메서드를 호출하여 받은 값을 반환하고 UrlProperty를 검색할 값으로 전달합니다.

  9. Url 속성에 대한 set 메서드를 정의합니다.

    set 메서드 본문에서 SetValue 기본 클래스 메서드를 호출하고 UrlProperty를 설정할 값으로 전달합니다.

    [DesignerSerializationVisibilityAttribute
        (DesignerSerializationVisibility.Visible)]
    [BrowsableAttribute(true)]
    [DescriptionAttribute("Url to download")]
    [CategoryAttribute("WebTearActivity Property")]
    public string Url
    {
        get
        {
            return ((string)(base.GetValue(WebTearActivity.UrlProperty)));
        }
        set
        {
            base.SetValue(WebTearActivity.UrlProperty, value);
        }
    }
    

Execute 메서드를 정의하려면

  1. WebTearActivity 클래스에서 Execute 기본 클래스 메서드를 재정의합니다.

  2. Execute 메서드에서 pageData라는 지역 String 변수를 만듭니다.

  3. client라는 지역 WebClient 변수를 만들고 해당 개체의 인스턴스를 만듭니다.

  4. try 블록을 만듭니다.

    해당 블록의 본문에서 client 개체의 DownloadString 메서드를 호출하고 클래스의 Url 속성을 매개 변수로 전달합니다.

  5. 이전 단계에서 만든 try 블록 뒤에 Exception 예외에 대한 catch 블록을 만듭니다.

    catch 블록의 본문에서 pageData 필드를 예외의 Message 속성으로 설정합니다.

  6. WebTearActivity 클래스에 정의된 PageFinished 이벤트를 발생시키고 다음을 매개 변수로 전달합니다.

    • null(Visual Basic의 경우 Nothing)

    • pageData를 생성자 매개 변수로 사용하는 새 PageFinishedEventArgs 개체

  7. Execute 메서드에서 Closed를 반환하여 Windows Workflow 런타임 엔진에 활동이 완료되었음을 알립니다. 최종 Execute 메서드는 다음 코드와 유사합니다.

    protected override ActivityExecutionStatus Execute
        (ActivityExecutionContext context)
    {
        string pageData;
        System.Net.WebClient client = new System.Net.WebClient();
    
        try
        {
            // Download the web page data
            pageData = client.DownloadString(this.Url);
        }
        catch (Exception e)
        {
            pageData = e.Message;
        }
    
        // Raise the PageFinished event back to the host
        pageFinishedEvent(null, new PageFinishedEventArgs(pageData));
    
        // Notifiy the runtime that the activity has finished
        return ActivityExecutionStatus.Closed;
    }
    

코드 컴파일

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

작업 2: 순차 워크플로에서 사용자 지정 활동 사용에서 방금 만든 사용자 지정 활동을 순차 워크플로에 추가합니다.

참고 항목

작업

작업 2: 순차 워크플로에서 사용자 지정 활동 사용

참조

Activity
Execute
ActivityExecutionContext
DependencyProperty
ActivityToolboxItem
Register
DependencyProperty

기타 리소스

자습서: 사용자 지정 활동 만들기

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.