ActivityDesigner와 CodeActivity: 연결, 활용, 그리고 그 관계 이해하기


1. ActivityDesigner와 CodeActivity의 관계

CodeActivity

CodeActivity는 Windows Workflow Foundation (WF)에서 액티비티를 구현하기 위한 기본 클래스 중 하나입니다. 이 클래스를 상속받아 Execute 메서드를 오버라이딩하면, 워크플로우에서 실행될 로직을 정의할 수 있습니다.

public class MyCodeActivity : CodeActivity
{
    protected override void Execute(CodeActivityContext context)
    {
        // 로직 구현
    }
}


ActivityDesigner

ActivityDesigner는 워크플로우 액티비티를 시각적으로 표현하고 편집하는 인터페이스를 제공합니다. 이는 주로 XAML을 사용하여 정의됩니다.

<sap:ActivityDesigner x:Class="MyNamespace.MyCodeActivityDesigner">
    <!-- UI 정의 -->
</sap:ActivityDesigner>


관계의 핵심

  1. 표현성과 사용성: CodeActivity가 로직을 담당하는 반면, ActivityDesigner는 사용자에게 이를 어떻게 표현할지 결정합니다.
  2. 디자인과 런타임 연계: ActivityDesignerCodeActivity의 속성과 바인딩되어, 디자인 시간의 변경이 런타임에도 반영됩니다.
  3. 재사용성과 확장성: CodeActivityActivityDesigner는 독립적으로 확장하고 재사용할 수 있습니다.


“디자인 시간의 변경이 런타임에도 반영됩니다”는 워크플로우 디자이너에서 편집한 액티비티의 속성이나 설정이 실제 실행 시점(런타임)의 워크플로우에도 적용된다는 의미입니다.

예를 들어, CodeActivity의 어떤 속성을 ActivityDesigner를 통해 변경했다면, 그 변경사항은 워크플로우가 실제로 실행될 때 해당 CodeActivity 인스턴스에 반영됩니다.
이는 디자이너에서의 편집과 실제 실행 사이에 일관성을 유지하게 해줍니다.


2. ActivityDesigner와 CodeActivity의 연결 방법

DesignerAttribute 사용

.NETDesignerAttribute를 사용하여 CodeActivity에 대한 디자이너를 지정할 수 있습니다.

[Designer(typeof(MyCodeActivityDesigner))]
public class MyCodeActivity : CodeActivity
{
    protected override void Execute(CodeActivityContext context)
    {
        // 로직 구현
    }
}

이렇게 하면, MyCodeActivity에 대한 디자이너로 MyCodeActivityDesigner가 지정됩니다.


확인 절차

  1. DesignerAttributeCodeActivity에 추가합니다.
  2. 워크플로우 디자이너에서 해당 액티비티를 드래그 앤 드롭하면, 지정된 ActivityDesigner가 표시됩니다.


3. 예시: 간단한 로그 작성 액티비티

CodeActivity 구현

public class LogActivity : CodeActivity
{
    public InArgument<string> Message { get; set; }

    protected override void Execute(CodeActivityContext context)
    {
        string message = Message.Get(context);
        Console.WriteLine(message);
    }
}


ActivityDesigner 구현

<sap:ActivityDesigner x:Class="MyNamespace.LogActivityDesigner">
    <TextBox Text="{Binding ModelItem.Message, Mode=TwoWay}" />
</sap:ActivityDesigner>


연결

[Designer(typeof(LogActivityDesigner))]
public class LogActivity : CodeActivity
{
    // 코드 생략
}


이제 LogActivity를 워크플로우 디자이너에 추가하면, LogActivityDesigner가 자동으로 로드되어 메시지를 입력할 수 있는 텍스트 박스를 제공합니다.



4. 마치며

ActivityDesignerCodeActivity의 적절한 조합과 연결은 워크플로우의 디자인 타임과 런타임을 이어주는 중요한 역할을 합니다.
이 둘을 정확하게 연결하고 활용하면, 워크플로우 개발 과정이 훨씬 더 효율적이고 사용자 친화적이 될 수 있습니다.

특히, .NETDesignerAttribute를 사용하여 두 컴포넌트를 쉽게 연결할 수 있고, 이를 통해 사용자는 워크플로우 디자이너 내에서 직관적으로 액티비티를 편집할 수 있습니다.
이런 접근 방식은 워크플로우 애플리케이션의 개발과 유지 보수를 크게 단순화할 수 있습니다.






정규표현식으로 시간 절약하기
당신의 하루에 몇 시간을 더하세요
WPF MVVM 패턴, 그리고 Binding
WPF(Windows Presentation Foundation) 시리즈
AWS SAA 준비 - (4) 비용에 최적화된 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (3) 안전한 아키텍처
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (2) 성능이 뛰어난 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (1) 복원력을 갖춘 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
15분 안에 ToC를 구현해보자!
Vanilla JS로 Table of Contents 구현하기
모듈
모던 자바스크립트 Deep Dive | 48장 | 모듈
에러 처리
모던 자바스크립트 Deep Dive | 47장 | 에러 처리
제너레이터와 async/await
모던 자바스크립트 Deep Dive | 46장 | 제너레이터와 async/await
프로미스
모던 자바스크립트 Deep Dive | 45장 | 프로미스
REST API
모던 자바스크립트 Deep Dive | 44장 | REST API
Ajax
모던 자바스크립트 Deep Dive | 43장 | Ajax
비동기 프로그래밍
모던 자바스크립트 Deep Dive | 42장 | 비동기 프로그래밍
타이머
모던 자바스크립트 Deep Dive | 41장 | 타이머
Set과 Map
모던 자바스크립트 Deep Dive | 37장 | Set과 Map
디스트럭처링
모던 자바스크립트 Deep Dive | 36장 | 디스트럭처링
브라우저의 렌더링 과정
모던 자바스크립트 Deep Dive | 38장 | 브라우저의 렌더링 과정
스프레드 문법
모던 자바스크립트 Deep Dive | 35장 | 스프레드 문법
이터러블
모던 자바스크립트 Deep Dive | 34장 | 이터러블
7번째 데이터 타입 Symbol
모던 자바스크립트 Deep Dive | 33장 | 7번째 데이터 타입 Symbol
String
모던 자바스크립트 Deep Dive | 32장 | String
RegExp
모던 자바스크립트 Deep Dive | 31장 | RegExp
Date
모던 자바스크립트 Deep Dive | 30장 | Date
Math
모던 자바스크립트 Deep Dive | 29장 | Math
DOM
모던 자바스크립트 Deep Dive | 39장 | DOM
Number
모던 자바스크립트 Deep Dive | 28장 | Number
배열
모던 자바스크립트 Deep Dive | 27장 | 배열
이벤트
모던 자바스크립트 Deep Dive | 40장 | 이벤트
ES6 함수의 추가 기능
모던 자바스크립트 Deep Dive | 26장 | ES6 함수의 추가 기능
클래스
모던 자바스크립트 Deep Dive | 25장 | 클래스
this
모던 자바스크립트 Deep Dive | 22장 | this
빌트인 객체
모던 자바스크립트 Deep Dive | 21장 | 빌트인 객체
strict mode
모던 자바스크립트 Deep Dive | 20장 | strict mode
클로저
모던 자바스크립트 Deep Dive | 24장 | 클로저
프로토타입
모던 자바스크립트 Deep Dive | 19장 | 프로토타입
함수와 일급 객체
모던 자바스크립트 Deep Dive | 18장 | 함수와 일급 객체
실행 컨텍스트
모던 자바스크립트 Deep Dive | 23장 | 실행 컨텍스트
생성자 함수에 의한 객체 생성
모던 자바스크립트 Deep Dive | 17장 | 생성자 함수에 의한 객체 생성
프로퍼티 어트리뷰트
모던 자바스크립트 Deep Dive | 16장 | 프로퍼티 어트리뷰트
let, const 키워드와 블록 레벨 스코프
모던 자바스크립트 Deep Dive | 15장 | let, const 키워드와 블록 레벨 스코프
전역 변수의 문제점
모던 자바스크립트 Deep Dive | 14장 | 전역 변수의 문제점
스코프
모던 자바스크립트 Deep Dive | 13장 | 스코프
함수
모던 자바스크립트 Deep Dive | 12장 | 함수
원시 값과 객체의 비교
모던 자바스크립트 Deep Dive | 11장 | 원시 값과 객체의 비교
객체 리터럴
모던 자바스크립트 Deep Dive | 10장 | 객체 리터럴
타입 변환과 단축 평가
모던 자바스크립트 Deep Dive | 9장 | 타입 변환과 단축 평가
제어문
모던 자바스크립트 Deep Dive | 8장 | 제어문
연산자
모던 자바스크립트 Deep Dive | 7장 | 연산자
데이터 타입
모던 자바스크립트 Deep Dive | 6장 | 데이터 타입
표현식과 문
모던 자바스크립트 Deep Dive | 5장 | 표현식과 문
변수
모던 자바스크립트 Deep Dive | 4장 | 변수
Iteration와 Generator
코드스피츠 77 ES6+ 3화 참조
WHATWG 탄생 배경
WHATWG, W3C, HTML의 관련에 대한 역사
프론트엔드(FE) 면접 질문 정리
FE관련 면접 질문 및 답변 정리한 내용입니다.
쿠버네티스(kubernetes, k8s) 용어 정리
쿠버네티스(kubernetes, k8s) 용어 정리
젠킨스(Jenkins) 정리
젠킨스(Jenkins) 정리
Docker 용어 정리
Docker 용어 정리
Git 용어 정리
Git 용어 정리
반응형 웹 디자인(Responsive Web Design)
CSS responsive 에 대하여
JS this에 대하여
this에 대해 알아보자
SQL*PLUS에 대하여
SQL*PLUS 정의 및 사용방법
Oracle에서 SQL Plan 확인하기
Oracle에서 SQL Plan을 확인해보자