기본 활동을 사용하는 사용자 지정 복합

CustomCompositeNativeActivity 샘플에서는 다른 Activity 개체가 워크플로 실행 흐름을 제어하도록 예약하는 NativeActivity를 작성하는 방법을 보여 줍니다. 이 샘플에서는 두 개의 일반적인 제어 흐름인 Sequence와 While을 사용하여 이러한 작업 수행 방법을 보여 줍니다.

샘플 세부 정보

MySequenceNativeActivity에서 파생되며, NativeActivityActivity 메서드에 전달된 NativeActivityContext를 통해 전체 워크플로 런타임을 노출하는 Execute 개체입니다.

MySequence는 워크플로 작성자가 채우는 Activity 개체의 공용 컬렉션을 노출합니다. 워크플로가 실행되기 전에 워크플로 런타임은 워크플로의 각 활동에 대해 CacheMetadata 메서드를 호출합니다. 이 프로세스가 진행되는 중에 런타임은 데이터 범위 지정 및 수명 주기 관리를 위해 부모-자식 관계를 설정합니다. CacheMetadata 메서드의 기본 구현은 MySequence 활동에 TypeDescriptor 인스턴스 클래스를 사용하여 Activity 또는 IEnumerable<Activity> 형식의 public 속성을 MySequence 활동의 자식으로 추가합니다.

활동에서 자식 활동의 공용 컬렉션을 노출할 때마다 해당 자식 활동이 상태를 공유할 가능성이 큽니다. 이 경우 부모 활동인 MySequence는 자식 활동이 이 작업을 수행할 때 사용하는 변수 컬렉션도 노출하는 것이 가장 좋습니다. 자식 활동과 마찬가지로 CacheMetadata 메서드도 Variable 또는 IEnumerable<Variable> 형식의 public 속성을 MySequence 활동과 연결된 변수로 추가합니다.

MySequenceMySequence의 자식이 조작하는 public 변수 외에도 자식의 실행 시 자신의 위치도 추적해야 하며, private 변수인 currentIndex를 사용하여 이 작업을 수행합니다. 이 변수는 MySequence 활동의 AddImplementationVariable 메서드 내에 있는 MySequence 메서드에 대한 호출을 추가하여 CacheMetadata 환경의 일부로 등록됩니다. MySequence Activities 컬렉션에 추가된 Activity 개체는 이러한 방식으로 추가된 변수에 액세스할 수 없습니다.

런타임에서 MySequence를 실행하면 런타임은 Execute 메서드를 호출하여 NativeActivityContext를 전달합니다. NativeActivityContext는 다른 Activity 개체 또는 ActivityDelegates를 예약하고 인수 및 변수를 역참조하기 위해 런타임으로 돌아가는 활동 프록시입니다. MySequenceInternalExecute 메서드를 사용하여 첫 번째 자식 및 이후의 모든 자식을 단일 메서드에 예약하는 논리를 캡슐화합니다. currentIndex를 역참조하는 작업으로 시작하며, Activities 컬렉션에서의 수와 같은 경우 시퀀스가 완료되고 활동은 작업을 예약하지 않고 반환되며 런타임은 Closed 상태로 이동됩니다. currentIndex가 활동 수보다 작으면 Activities 컬렉션에서 다음 자식을 가져오고 MySequenceScheduleActivity를 호출하여 예약할 자식과 InternalExecute 메서드에서 가리키는 CompletionCallback을 전달합니다. 마지막으로 currentIndex가 증가하고 제어 권한이 다시 런타임에 제공됩니다. MySequence의 인스턴스에 예약된 자식 Activity 개체가 있으면 런타임은 해당 개체가 실행 상태에 있는 것으로 간주합니다.

자식 활동이 완료되면 CompletionCallback이 실행됩니다. 루프가 맨 위부터 계속됩니다. Execute와 마찬가지로 CompletionCallbackNativeActivityContext를 사용하여 구현자에게 런타임에 대한 액세스 권한을 제공합니다.

MyWhile은 단일 Activity 개체를 반복적으로 예약하고 Condition이라는 Activity<TResult><bool>을 사용하여 이 예약이 발생해야 하는지 여부를 결정한다는 점에서 MySequence와 다릅니다. MySequence와 마찬가지로 MyWhileInternalExecute 메서드를 사용하여 예약 논리를 중앙 집중화합니다. 그리고 OnEvaluationCompleted라는 CompletionCallback<TResult><bool>을 사용하여 ConditionActivity<bool>을 예약합니다. Condition의 실행이 완료되면 CompletionCallback라는 강력한 형식의 매개 변수에서 이 result을 통해 그 결과를 사용할 수 있습니다. true이면 MyWhileScheduleActivity을 호출하여 BodyActivity 개체와 InternalExecuteCompletionCallback으로 전달합니다. Body의 실행이 완료되면 Condition에서 InternalExecute이 다시 예약되어 루프가 다시 시작됩니다. Condition에서 false를 반환하면 MyWhile의 인스턴스는 Body를 예약하지 않고 런타임에 제어 권한을 다시 제공하며 런타임은 Closed 상태로 이동됩니다.

샘플을 설치, 빌드 및 실행하려면

  1. Visual Studio에서 Composite.sln 샘플 솔루션을 엽니다.

  2. 솔루션을 빌드하고 실행합니다.