Gestione di dati complessi in un flusso di lavoro

 

Data di pubblicazione: luglio 2016

DynamicValue consente di creare, archiviare e usare strutture di dati. I dati possono essere ricorsivi. In altri termini, un'istanza di DynamicValue può contenere altre istanze di DynamicValues. Le regole di composizione di DynamicValue sono molto semplici: le relative proprietà possono infatti essere primitive, matrici o altre istanze di DynamicValues, in modo analogo a un contenitore di proprietà ricorsivo o un formato di serializzazione JSON.DynamicValue fornisce un meccanismo di contenimento e manipolazione per dati composti con superficie di binding avanzata per WF.

Modalità di archiviazione dei dati di DynamicValue

È possibile considerare DynamicValue come un elenco ricorsivo di coppie chiave-valore. Nella tabella seguente viene rappresentata un'istanza semplice di DynamicValue.

Nome

Valore del tipo di dati primitivo sottostante

Age

42

Nome

John Doe

Nella tabella precedente DynamicValue ha due proprietà: Age con valore 42 e Name con valore John Doe. Il nome di una proprietà di DynamicValue è costituito da una stringa e il valore può essere uno dei tipi elencati di seguito oppure null (Nothing in Visual Basic). Per qualsiasi altro tipo passato a DynamicValue viene generata un'eccezione.

  • String

  • Int32

  • Double

  • Guid

  • Boolean

  • DateTime

  • TimeSpan

  • IList<T>, dove T è uno dei tipi nell'elenco

  • IDictionary<string, T>, dove T è uno dei tipi nell'elenco

  • DynamicValue

Si noti che DynamicValue è incluso nell'elenco dei tipi supportati. Questo significa che il valore di un'istanza di DynamicValue può essere un'altra istanza di DynamicValue, come illustrato nella tabella seguente.

Nome

Valore

Cliente

Nome

Valore

Age

42

Nome

John Doe

Società

Contoso Corporation

Customer contiene come valore un'istanza di DynamicValue e tale istanza di DynamicValue contiene Age e Name. Per fare riferimento al valore di Name è possibile usare Customer/Name. Se è presente un riferimento a Customer/Name ma tale valore non è stato ancora creato, verrà aggiunto automaticamente. Questo meccanismo è definito upsert.

DynamicValue supporta anche la nozione di matrice. Per matrice si intende un set di valori primitivi contenuti come valore per un'istanza di DynamicValue. La differenza principale tra un'istanza di DynamicValue di tipo matrice e un'istanza di DynamicValue nidificata consiste nel fatto che gli elementi della matrice non hanno un nome e sono accessibili in base a un indice. Si noti che le matrici possono contenere tipi differenti. Nel valore di matrice per Numbers, i tipi sono Int32 e Double. Nel valore di matrice per Items, i valori sono di tipo DynamicValue nidificato e Int32.

Nome

Valore

Numeri

4

6

3

3,14

2,71

Elementi

Nome

Valore

Nome

4

Secondo

5

6

Indirizzamento dei valori in un'istanza di DynamicValue

I valori vengono impostati e recuperati da un'istanza di DynamicValue in base a una notazione di percorso. I percorsi sono stringhe simili a Uri che puntano a una determinata proprietà, in modo analogo alla rappresentazione bidimensionale di una struttura. I percorsi sono composti dal nome di una proprietà, costituito da una stringa, o da un indice relativo a un elemento all'interno di un valore di tipo matrice, costituito da un numero tra parentesi.

Nota

Per informazioni sull'utilizzo dei percorsi DynamicValue, vedere l'esempio di codice relativo all'analizzatore di percorsi DynamicValue. Mediante l'esempio relativo all'analizzatore di percorsi DynamicValue è possibile immettere l'endpoint di un servizio REST che restituisce risultati JSON e acquisire familiarità con DynamicValue e i percorsi dei dati restituiti.

Nella sezione precedente sono stati illustrati alcuni esempi di DynamicValue. Il primo esempio si riferisce a un'istanza di DynamicValue con due valori, come illustrato nella tabella seguente.

Nome

Valore

Age

42

Nome

John Doe

Per l'accesso al primo valore, viene usato un percorso costituito dalla proprietà Age che restituisce il valore 42. Per il secondo valore, viene invece usato il percorso Name, che restituisce John Doe.

Nel secondo esempio della sezione precedente sono stati inclusi alcuni valori nidificati, come illustrato nella tabella seguente.

Nome

Valore

Cliente

Nome

Valore

Age

42

Nome

John Doe

Società

Contoso Corporation

Il percorso costituito dalla proprietà Customer restituisce un'istanza di DynamicValue contenente a sua volta due valori. Il percorso costituito dalla proprietà Company restituisce il valore Contoso Corporation. Per l'accesso ai valori nidificati, viene usato il simbolo / per delineare le proprietà. Mediante questa notazione, il percorso Customer/Age restituisce il valore 42 e il percorso Customer/Name restituisce John Doe.

Per l'accesso ai valori inclusi in una matrice, nel percorso vengono usati gli indici. Nella tabella seguente viene rappresentata l'istanza di DynamicValue della sezione precedente, contenente istanze di DynamicValues di tipo matrice e nidificate.

Nome

Valore

Numeri

4

6

3

3,14

2,71

Elementi

Nome

Valore

Nome

4

Secondo

5

6

Nell'istanza di DynamicValue illustrata nella tabella precedente, il percorso Numbers restituisce la prima matrice. Le matrici di DynamicValue sono in base zero. Di conseguenza, Numbers(0) restituisce il primo elemento della matrice, mentre Numbers(3) restituisce il quarto elemento.Items restituisce la seconda matrice e Items(0) restituisce il primo elemento della matrice, che corrisponde a un'istanza di DynamicValue. Per l'accesso ai valori in questa istanza nidificata di DynamicArray, i nomi di proprietà vengono combinati con il percorso che genera la matrice.Items(0)/First restituisce 4 e Items(0)/Second restituisce 5.

È possibile usare i percorsi per creare in modo dichiarativo una struttura di dati composta. I valori possono essere esplicitati in fase di progettazione oppure associati dinamicamente in fase di esecuzione. Nell'esempio seguente viene illustrato un set di percorsi e valori che rappresentano una composizione di un cliente con un indirizzo.

Percorso (A)

Valore (Da)

Nome

John

Cognome

Doe

Address/City

Redmond

Address/State

CN

I percorsi e i valori nella tabella precedente creeranno l'istanza di DynamicValue rappresentata dalla tabella seguente.

Nome

Valore

Nome

John

Cognome

Doe

Address

Nome

Valore

Città

Redmond

State

CN

Il tipo DynamicValue fornisce un metodo Parse per analizzare una stringa JSON e convertirla in un'istanza di DynamicValue. È inoltre disponibile un'attività ParseDynamicValue che può essere usata nei flussi di lavoro per analizzare una stringa JSON e convertirla in un'istanza di DynamicValue.

DynamicValue può essere riconosciuto anche dalle attività HTTP. Se si assegna un'istanza di DynamicValue alla risposta di un'attività HTTP*, come risultato viene generata una stringa JSON, in base alla quale viene creata un'istanza di DynamicValue. Se si passa un'istanza di DynamicValue al corpo della richiesta o si usa tale istanza come contenuto della risposta, vengono aggiunte le intestazioni appropriate per indicare l'utilizzo di JSON.

Utilizzo di DynamicValue nei flussi di lavoro

Oltre al tipo DynamicValue, Progettazione flussi di lavoro 1.0 fornisce anche attività per la creazione e l'utilizzo di DynamicValue nei flussi di lavoro.

Attività

Descrizione

Argomenti

BuildDynamicValue

Crea un'istanza di DynamicValue. Riceve come input un dizionario di percorsi e valori e restituisce l'istanza di DynamicValue risultante. Per la creazione dell'istanza di DynamicValue viene usato un approccio ad assegnazioni multiple, ossia vengono accettati più percorsi e valori.

È possibile usare questa attività per creare una nuova istanza di DynamicValue o per modificarne una esistente.

InArgument<IDictionary<string,InArgument>> Properties

InOutArgument<DynamicValue> Result

ContainsDynamicValueProperty

Restituisce true se un'istanza di DynamicValue contiene una proprietà rappresentata dal percorso specificato.

InArgument<DynamicValue> Source

InArgument<DynamicValue> PropertyName

OutArgument<bool> Result

CopyDynamicValue

Copia le proprietà da un'istanza di DynamicValue a un'altra.

InArgument<IDictionary<string,string>> PropertyMapping

InArgument<DynamicValue> Source

OutArgument<DynamicValue> Result

CountDynamicValueItems

Restituisce il numero totale di elementi figlio in un percorso di DynamicValue.

InArgument<DynamicValue> Source

OutArgument<int> Result

CreateDynamicValue

Crea un'istanza di DynamicValue passando solo un percorso e un valore, senza usare la semantica ad assegnazioni multiple.

InArgument<string> PropertyName

InArgument PropertyValue

OutArgument<DynamicValue> Result

T:Microsoft.Activities.CreateDynamicValueFromMessage

Crea un'istanza di DynamicValue in base a un messaggio SOAP.

InArgument<DynamicValue> Headers

InArgument<XElement> Value

InArgument<MessageVersion> Version

OutArgument<DynamicValue> Result

T:Microsoft.Activities.CreateMessageFromDynamicValue

Crea un messaggio SOAP in base a un'istanza di DynamicValue con formattazione specifica.

InArgument<string> Action

InArgument<DynamicValue> Headers

InArgument<DynamicValue> Body

InArgument<MessageVersion> Version

OutArgument<XElement> Result

CreateUriFromDynamicValue

Crea un URI in base a un'istanza di DynamicValue.

InArgument<DynamicValue> Options

OutArgument<string> Result

GetDynamicValueProperties

Ottiene alcune proprietà di un'istanza di DynamicValue esistente. Data un'istanza di DynamicValue, un utente può richiedere più proprietà, passando più percorsi, mediante un'unica attività.

InArgument<DynamicValue> Source

InArgument<IDictionary<string,OutArgument>> Properties

GetDynamicValueProperty<T>

Ottiene una proprietà di un'istanza di DynamicValue, dove T è uno dei tipi inclusi nell'elenco specificato in precedenza.

InArgument<DynamicValue> Source

InArgument<string> PropertyName

OutArgument<T> Result

ParseDynamicValue

Analizza una stringa JSON e la converte in un'istanza di DynamicValue.

InArgument<string> JSON

OutArgument<DynamicValue> Result

Utilizzo di DynamicValue

DynamicValue e le relative attività di supporto consentono la rappresentazione e la manipolazione dei dati in una modalità indipendente dall'host. Di conseguenza, DynamicValue è una funzionalità per flussi di lavoro che può essere usata con qualsiasi host del flusso di lavoro e non è quindi limitata a Progettazione flussi di lavoro 1.0. È infatti possibile usarla con qualsiasi altro host del flusso di lavoro esistente, ad esempio WorkflowInvoker, WorkflowApplication e WorkflowServiceHost.

L'esempio di codice relativo alla gestione di dati complessi in un flusso di lavoro mediante DynamicValue illustra la modalità di utilizzo di questa funzionalità con WorkflowApplication. Alcuni degli altri esempi di No text is specified for bookmark or legacy link '89435d1b-f316-4e02-84a9-971a32bb797d#BKMK_DynamicValueSamples'. illustrano come usare DynamicValue nei flussi di lavoro di Progettazione flussi di lavoro 1.0. L'utilizzo di DynamicValue è indipendente dall'host. Per ogni host varia soltanto la modalità di caricamento dei dati nell'istanza di DynamicValue. Ad esempio, in Progettazione flussi di lavoro 1.0 l'istanza di DynamicValue viene in genere creata come risultato di un'operazione HTTP mediante attività HTTP.

Nota

Per informazioni sugli esempi di Progettazione flussi di lavoro 1.0 e sul relativo indirizzo di download, vedere Esempi di Workflow Manager 1.0.