Compartilhar via


Composto Personalizado usando Atividade Nativa

O exemplo CustomCompositeNativeActivity demonstra como escrever um NativeActivity que agenda outros objetos Activity para controlar o fluxo de execução de um fluxo de trabalho. Este exemplo usa dois fluxos comuns de controle, Sequência e Enquanto, para demonstrar como fazer isso.

Detalhes de exemplo

Iniciando com MySequence, a primeira coisa a observar é que deriva de NativeActivity. NativeActivity é o objeto de Activity que expõe a extensão completa do runtime de fluxo de trabalho através do NativeActivityContext passado para o método Execute.

MySequence expõe uma coleção pública de Activity objetos que é preenchida pelo autor do fluxo de trabalho. Antes que o fluxo de trabalho seja executado, o tempo de execução de fluxo de trabalho chama o método CacheMetadata em cada atividade no fluxo de trabalho. Durante esse processo, o ambiente de execução estabelece relações pai-filho para o escopo de dados e o gerenciamento do ciclo de vida. A implementação padrão do método CacheMetadata usa a classe de instância TypeDescriptor para a atividade MySequence para adicionar qualquer propriedade pública do tipo Activity ou IEnumerable<Activity> como filho do MySequence atividade.

Sempre que uma atividade expõe uma coleção pública de atividades filhas, é provável que essas atividades filhas compartilhem estado. É uma prática recomendada que as atividades pai, nesse caso MySequence, também exponham uma coleção de variáveis através das quais as atividades filho podem realizar isso. Assim como as atividades filhas, o método CacheMetadata adiciona propriedades públicas do tipo Variable ou IEnumerable<Variable> como variáveis associadas à atividade MySequence.

Além das variáveis públicas, que são manipuladas pelos filhos de MySequence, MySequence também deve manter controle de onde está na execução de seus filhos. Usa uma variável particular, currentIndex, para fazer isso. Essa variável é registrada como parte do ambiente MySequence adicionando uma chamada ao método AddImplementationVariable dentro do método MySequence da atividade CacheMetadata. Os objetos Activity adicionados à coleção MySequenceActivities não podem acessar variáveis ​​adicionadas dessa forma.

Quando MySequence é executado em runtime, o runtime chama o método de Execute , passando NativeActivityContext. O NativeActivityContext é o proxy da atividade de volta ao tempo de execução para desreferenciar argumentos e variáveis, bem como agendar outros objetos Activity ou ActivityDelegates. MySequence usa um método de InternalExecute para encapsular a lógica de agendar o primeiro filho e todos os filhos subsequentes em um único método. Inicia desreferenciando currentIndex. Se for igual à contagem na coleção de Activities, então a sequência está concluída, a atividade retorna sem agendar qualquer trabalho e o runtime a move para o estado de Closed. Se o currentIndex for menor que a contagem de atividades, obtém-se a próxima subatividade da coleção Activities e MySequence chama ScheduleActivity, passando a subatividade a ser agendada e um CompletionCallback que referencia o método InternalExecute. Finalmente, currentIndex é incrementado e o controle é rendido de volta para o runtime. Enquanto uma instância de MySequence tem um objeto filho de Activity agendado, o tempo de execução considera-o no estado de execução.

Quando a atividade filho termina, CompletionCallback é executado. O loop continua do início. Como Execute, um CompletionCallback aceita um NativeActivityContext, dando ao implementador acesso ao tempo de execução.

MyWhile difere de MySequence porque agenda um único objeto Activity repetidamente e usa um Activity<TResult><bool> chamado Condition para determinar se esse agendamento deve ocorrer. Como MySequence, MyWhile usa um método de InternalExecute para centralizar sua lógica de programação. Ele agenda o ConditionActivity<bool> com um CompletionCallback<TResult><bool> chamado OnEvaluationCompleted. Quando a execução de Condition é concluída, o resultado fica disponível por meio deste CompletionCallback em um parâmetro fortemente tipado chamado result. Se true, MyWhile chama ScheduleActivity, passando o objeto BodyActivity e InternalExecute como o CompletionCallback. Quando a execução de Body terminar, Condition é agendada novamente em InternalExecute, iniciando novamente o loop. Quando Condition retorna false, uma instância de MyWhile fornece o controle de volta ao runtime sem agendar Body e o runtime move-o para o estado de Closed.

Para configurar, compilar, e executar o exemplo

  1. Abra a solução de exemplo de Composite.sln em Visual Studio.

  2. Compile e execute a solução.