Atividade nativo de usar composta personalizada
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 usar dois fluxos comuns de controle, e quando sequência, para demonstrar como fazer isso.
Detalhes de exemplo
Iniciando com MySequence
, a primeira coisa para observar que é derivada de NativeActivity. NativeActivity é o objeto de Activity que expõe a largura total do runtime de fluxo de trabalho com NativeActivityContext passado para o método de Execute
.
MySequence
expõe uma coleção pública de objetos Activity que obtém preenchido pelo autor de fluxo de trabalho. Antes que o fluxo de trabalho é executado, o runtime de fluxo de trabalho chama o método de CacheMetadata em cada atividade em um fluxo de trabalho. Durante esse processo, o runtime estabelecer relações pai-filho para o escopo de dados e o gerenciamento de tempo 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 filhos, é provável estado filho de compartilhamento dessas atividades. É uma prática recomendada para atividades pai, nesse caso MySequence
, também expor uma coleção de variáveis com que as atividades filho podem fazer 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 de variáveis públicas, que são manipulados pelos filhos de MySequence
, MySequence
também deve manter controle de onde está em 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 CacheMetadata da atividade MySequence
. Os objetos Activity adicionados à coleção MySequence
Activities
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 a contagem na coleção de Activities
, então a sequência está concluída, a atividade retorna agendar sem qualquer trabalho e o runtime movê-lo no estado de Closed . Se o currentIndex
for menor que a contagem de atividades, o próximo filho é obtido da coleção Activities
e MySequence
chama ScheduleActivity, passando o filho a ser agendado e um CompletionCallback que aponta para o método InternalExecute
. Finalmente, currentIndex
é incrementado e o controle é rendido de volta para o runtime. Como uma instância de MySequence
tem um objeto filho de Activity agendada, o runtime considera-o estar no estado executando.
Quando a atividade filho termina, CompletionCallback é executado. O loop continua a parte superior. Como Execute
, CompletionCallback leva NativeActivityContext, fornecendo acesso do implementador em runtime.
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 Condition
Activity<bool> com um CompletionCallback<TResult><bool> chamado OnEvaluationCompleted
. Quando a execução de Condition
é concluída, o resultado fica disponível com esse CompletionCallback em um parâmetro fortemente tipado chamado result
. Se true
, MyWhile
chama ScheduleActivity, passando o objeto Body
Activity e InternalExecute
como o CompletionCallback. Quando a execução de Body
terminar, Condition
obtém agendada novamente em InternalExecute
, iniciar o loop sobre novamente. Quando Condition
retorna false
, uma instância de MyWhile
fornece o controle de volta para o runtime sem agendar Body
e o runtime movê-lo ao estado de Closed .
Para configurar, compilar, e executar o exemplo
Abra a solução de exemplo de Composite.sln em Visual Studio.
Compile e execute a solução.