Opzioni di creazione di attività in WF

.NET Framework 4.6.1 offre diverse opzioni per la creazione di attività personalizzate. Il metodo corretto da usare per la creazione di un'attività specifica dipende dalle funzionalità di runtime richieste.

Scelta della classe di attività di base da usare per la creazione di attività personalizzate

Nella tabella seguente sono elencate le funzionalità disponibili nelle classi di base di attività personalizzate.

Classe di attività di base Funzionalità disponibili
Activity Compone gruppi di attività fornite dal sistema e personalizzate in un'attività composita.
CodeActivity Implementa la funzionalità imperativa fornendo un metodo Execute di cui può essere eseguito l'override. Inoltre fornisce l'accesso a rilevamenti, variabili e argomenti.
NativeActivity Fornisce tutte le funzionalità dell'oggetto CodeActivity, oltre all'interruzione dell'esecuzione di attività, all'annullamento dell'esecuzione di attività figlio, all'utilizzo di segnalibri e alla pianificazione di attività, azioni di attività e funzioni.
DynamicActivity Fornisce un approccio di tipo DOM alla costruzione di attività che si interfacciano con l'utilità di progettazione di WF e il sistema di runtime tramite l'oggetto ICustomTypeDescriptor, consentendo la creazione di nuove attività senza definire nuovi tipi.

Creazione di attività tramite la classe Activity

Le attività che derivano dalla classe Activity compongono la funzionalità assemblando altre attività esistenti. Queste attività possono essere attività personalizzate e attività esistenti dalla libreria di attività di .NET Framework 4.6.1. L'assemblaggio di queste attività è il modo più comunemente usato per creare la funzionalità personalizzata. Questo approccio viene generalmente adottato quando si usa un ambiente di progettazione visiva per la creazione di flussi di lavoro.

Creazione di attività tramite CodeActivity o AsyncCodeActivity

Le attività che derivano dalla classe CodeActivity o AsyncCodeActivity possono implementare la funzionalità imperativa eseguendo l'override del metodo Execute con codice imperativo personalizzato. Il codice personalizzato viene eseguito quando l'attività viene eseguita dal runtime. Le attività create in questo modo possono accedere alla funzionalità personalizzata, ma non a tutte le funzionalità del runtime, ad esempio non dispongono dell'accesso completo all'ambiente di esecuzione, non dispongono della capacità di pianificare le attività figlio, di creare segnalibri o di supportare un metodo Cancel o Abort. Quando una classe CodeActivity viene eseguita, dispone dell'accesso a una versione ridotta dell'ambiente di esecuzione (tramite la classe CodeActivityContext o AsyncCodeActivityContext). Le attività create usando la classe CodeActivity dispongono dell'accesso alla risoluzione di argomenti e variabili, alle estensioni e ai rilevamenti. La pianificazione di attività asincrone può essere eseguita usando la classe AsyncCodeActivity.

Creazione di attività tramite la classe NativeActivity

Le attività che derivano dalla classe NativeActivity, come quelle che derivano dalla classe CodeActivity creano la funzionalità imperativa eseguendo l'override del metodo Execute, ma dispongono anche dell'accesso a tutta la funzionalità del runtime del flusso di lavoro tramite la classe NativeActivityContext che viene passata al metodo Execute. Questo contesto supporta la pianificazione e l'annullamento di attività figlio, eseguendo gli oggetti ActivityAction e ActivityFunc<TResult>, propagando le transazioni in un flusso di lavoro, richiamando i processi asincroni, annullando e interrompendo l'esecuzione, accedendo alle proprietà e alle estensioni di esecuzione e ai segnalibri (handle per il ripristino dei flussi di lavoro sospesi).

Creazione di attività tramite la classe DynamicActivity

A differenza degli altri tre tipi di attività, non viene creata una nuova funzionalità derivando nuovi tipi dalla classe DynamicActivity (la classe è sealed), bensì assemblando la funzionalità nelle proprietà Properties e Implementation tramite un modello a oggetti documento (DOM) dell'attività.

Creazione di attività che restituiscono un risultato

Molte attività devono restituire un risultato dopo la relativa esecuzione. Anche se a tal fine è sempre possibile definire un oggetto OutArgument<T> personalizzato in un'attività, è consigliabile usare invece l'oggetto Activity<TResult> o derivare dall'oggetto CodeActivity<TResult> o NativeActivity<TResult>. Ognuna di queste classi di base dispone di un oggetto OutArgument<T> denominato Result che l'attività può usare per il relativo valore restituito. Le attività che restituiscono un risultato devono essere usate solo se solo un risultato deve essere restituito da un'attività. Se devono essere restituiti più risultati, è necessario usare i membri OutArgument<T> separati.