Opções de criação de atividade de WF
O .NET Framework 4.6.1 fornece várias opções para criar atividades personalizados. O método correto para usar para criar uma atividade determinada depende de quais recursos de tempo de execução são necessários.
Decidindo qual classe base de atividade usar para criar atividades personalizados
A tabela a seguir lista recursos disponíveis nas classes base personalizados de atividade.
Classe base de atividade | Recursos disponível |
---|---|
Activity | Composta grupos de sistema fornecido e atividades personalizadas em uma atividade composta. |
CodeActivity | Implementa a funcionalidade imperativa fornecendo um método de Execute que pode ser substituído. Também fornece acesso a acompanhar, a variáveis, e a argumentos. |
NativeActivity | Fornece todos os recursos de CodeActivity, mais nulo a execução da atividade, cancelar a execução filho da atividade, o uso de indexadores, e agendar atividades, ações de atividade, e funções. |
DynamicActivity | Fornece a DOM como abordagem para construir as atividades que interfaces com o designer de WF e a maquinaria de tempo de execução com ICustomTypeDescriptor, permitindo que as novas atividades são criados sem definir novos tipos. |
Atividades de design usando a atividade
As atividades que derivam de Activity compor a funcionalidade montando outras atividades existentes. Essas atividades podem ser atividades personalizadas existentes e atividades de biblioteca de atividade do .NET Framework 4.6.1. Montar as atividades é a maneira mais básica de criar a funcionalidade personalizada. Essa abordagem é mais normalmente efetuado ao usar um ambiente de design visual para criar fluxos de trabalho.
Atividades de design usando CodeActivity ou AsyncCodeActivity
As atividades que derivam de CodeActivity ou de AsyncCodeActivity podem implementar a funcionalidade imperativa substituindo o método de Execute com código obrigatório personalizado. O código personalizado é executado quando a atividade é executada em runtime. Quando as atividades criadas dessa maneira tenham acesso à funcionalidade personalizada, não tem acesso a todos os recursos de runtime, como acesso completo para o ambiente de execução, a capacidade agendar atividades filhos, a criação do indexador, ou o suporte para um método de cancelamento ou de abort. Quando CodeActivity executa, tem acesso a uma versão reduzida do ambiente de execução (por meio da classe CodeActivityContext ou de AsyncCodeActivityContext ). As atividades criadas usando CodeActivity têm acesso a resolução do argumento e da variável, às extensões, e rastrear. Programação assíncrona de atividade pode ser feita usando AsyncCodeActivity.
Atividades de design usando NativeActivity
As atividades que derivam de NativeActivity, como aqueles que derivam de CodeActivity, criam a funcionalidade imperativa substituindo Execute, mas também têm acesso a qualquer funcionalidade de runtime de fluxo de trabalho com NativeActivityContext que é passado para o método de Execute . Este contexto tem suporte para agendar e cancelar atividades filhos, execute ActivityAction e objetos de ActivityFunc<TResult> , fluir transações em um fluxo de trabalho, chamar processos assíncronas, cancelar e nulo a execução, o acesso às propriedades de execução e extensões, e indexadores (alças para continuar fluxos de trabalho em pausa).
Atividades de design usando DynamicActivity
Diferentemente de outros três tipos de atividade, a nova funcionalidade não é criada criando novos tipos de DynamicActivity (a classe é fechada), mas em vez disso, montando funcionalidade em Properties e as propriedades de Implementation que usam uma atividade documentam o modelo de objeto (DOM).
Atividades de design que retornam um resultado
Muitas atividades deve retornar um resultado após sua execução. Embora seja possível definir sempre essa finalidade OutArgument<T> personalizado em uma atividade, é para usar Activity<TResult>, ou derivar de CodeActivity<TResult> ou de NativeActivity<TResult>. Cada uma dessas classes base tem OutArgument<T> nomeado o resultado da atividade pode usar para o seu valor de retorno. As atividades que retornam um resultado devem ser utilizadas somente se apenas um resultado precisa ser retornado de uma atividade; se vários resultados precisam ser retornados, os membros separados de OutArgument<T> devem ser usados em vez disso.