Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
WorkflowIdentity
offre agli sviluppatori di applicazioni flusso di lavoro un modo per associare un nome e una versione a una definizione del flusso di lavoro. Consente inoltre di associare queste informazioni a un'istanza persistente del flusso di lavoro. Queste informazioni di identità possono essere usate dagli sviluppatori di applicazioni flusso di lavoro per scenari quali l'esecuzione affiancata di più versioni di una definizione del flusso di lavoro e costituiscono un elemento fondamentale per altre funzionalità come l'aggiornamento dinamico. In questo passaggio dell'esercitazione viene illustrato come usare WorkflowIdentity
per ospitare più versioni di un flusso di lavoro contemporaneamente.
Contenuto dell'argomento
In questo passaggio dell'esercitazione, le attività di WriteLine
nel flusso di lavoro vengono modificate per fornire informazioni aggiuntive e viene aggiunta una nuova attività WriteLine
. Una copia dell'assembly originale del flusso di lavoro viene archiviata e l'applicazione host viene aggiornata in modo da poter eseguire il flusso di lavoro originale e aggiornato contemporaneamente.
Per eseguire una copia del progetto NumberGuessWorkflowActivities
Per aggiornare WorkflowVersionMap in modo da includere le versioni precedenti del flusso di lavoro
Nota
Prima di effettuare i passaggi di questo argomento, eseguire l'applicazione, avviare diversi flussi di lavoro di ogni tipo ed effettuare uno o due tentativi per ciascuno di essi. Questi flussi di lavoro persistenti vengono usati in questo passaggio e nel passaggio seguente Procedura: Aggiornare la definizione di un'istanza del flusso di lavoro in esecuzione.
Per eseguire una copia del progetto NumberGuessWorkflowActivities
Aprire la soluzione WF45GettingStartedTutorial in Visual Studio 2012, se non è già aperta.
Premere CTRL+MAIUSC+B per compilare la soluzione.
Chiudere la soluzione WF45GettingStartedTutorial.
Aprire Esplora risorse e passare alla cartella in cui si trova il file della soluzione di esercitazione e le cartelle del progetto.
Creare una nuova cartella denominata PreviousVersions nella stessa cartella di NumberGuessWorkflowHost e NumberGuessWorkflowActivities. Questa cartella è usata per contenere gli assembly che includono le diverse versioni dei flussi di lavoro usate nei passaggi successivi dell'esercitazione.
Passare alla cartella NumberGuessWorkflowActivities\bin\debug (o bin\release, a seconda delle impostazioni del progetto). Copiare NumberGuessWorkflowActivities.dll e incollarlo nella cartella PreviousVersions.
Rinominare il file NumberGuessWorkflowActivities.dll presente nella cartella PreviousVersions in NumberGuessWorkflowActivities_v1.dll.
Nota
Nei passaggi di questo argomento viene illustrato un modo per gestire gli assembly usati per contenere più versioni dei flussi di lavoro. È anche possibile usare altri metodi, come l'assegnazione dei nomi sicuri agli assembly e la registrazione degli assembly nella Global Assembly Cache.
Creare una nuova cartella denominata NumberGuessWorkflowActivities_du nella stessa cartella di NumberGuessWorkflowHost, NumberGuessWorkflowActivities e della cartella appena aggiunta PreviousVersions e copiare tutti i file e tutte le sottocartelle dalla cartella NumberGuessWorkflowActivities nella nuova cartella NumberGuessWorkflowActivities_du. Questa copia di backup del progetto per la versione iniziale delle attività viene usata in Procedura: Aggiornare la definizione di un'istanza del flusso di lavoro in esecuzione.
Riaprire la soluzione WF45GettingStartedTutorial in Visual Studio 2012.
Per aggiornare i flussi di lavoro
Questa sezione aggiorna le definizioni di flusso di lavoro. Le due attività WriteLine
che forniscono il feedback sul tentativo dell'utente vengono aggiornate e viene aggiunta una nuova attività WriteLine
che fornisce informazioni aggiuntive sul gioco una volta determinato il numero.
Per aggiornare il flusso di lavoro StateMachine
In Esplora soluzioni, sotto il progetto NumberGuessWorkflowActivities, fare doppio clic su StateMachineNumberGuessWorkflow.xaml.
Fare doppio clic sulla transizione Guess Incorrect nella macchina a stati.
Aggiornare l'oggetto
Text
diWriteLine
all'estrema sinistra dell'attivitàIf
.Guess & " is too low."
Guess + " is too low."
Aggiornare l'oggetto
Text
diWriteLine
all'estrema destra dell'attivitàIf
.Guess & " is too high."
Guess + " is too high."
Tornare alla visualizzazione generale della macchina a stati nella finestra di progettazione del flusso di lavoro facendo clic su StateMachine nella visualizzazione della barra di navigazione nella parte superiore della finestra di progettazione del flusso di lavoro.
Fare doppio clic sulla transizione Guess Correct nella macchina a stati.
Trascinare un'attività WriteLine dalla sezione Primitive della Casella degli strumenti e rilasciarla sull'etichetta Rilascia l'attività Action qui della transizione.
Digitare l'espressione seguente nella casella della proprietà
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Per aggiornare il flusso di lavoro Flowchart
In Esplora soluzioni, sotto il progetto NumberGuessWorkflowActivities, fare doppio clic su FlowchartNumberGuessWorkflow.xaml.
Aggiornare l'oggetto
Text
dell'attivitàWriteLine
all'estrema sinistra.Guess & " is too low."
Guess + " is too low."
Aggiornare l'oggetto
Text
dell'attivitàWriteLine
all'estrema destra.Guess & " is too high."
Guess + " is too high."
Trascinare un'attività WriteLine dalla sezione Primitive della Casella degli strumenti e rilasciarla sul punto di rilascio dell'azione
True
dell'oggettoFlowDecision
più in alto. L'attività diWriteLine
viene aggiunta al diagramma di flusso e collegata all'azioneTrue
diFlowDecision
.Digitare l'espressione seguente nella casella della proprietà
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Per aggiornare il flusso di lavoro Sequential
In Esplora soluzioni, sotto il progetto NumberGuessWorkflowActivities, fare doppio clic su SequentialNumberGuessWorkflow.xaml.
Aggiornare l'oggetto
Text
diWriteLine
all'estrema sinistra dell'attivitàIf
.Guess & " is too low."
Guess + " is too low."
Aggiornare l'oggetto
Text
dell'attivitàWriteLine
all'estrema destra dell'attivitàIf
.Guess & " is too high."
Guess + " is too high."
Trascinare un'attività WriteLine dalla sezione Primitive della Casella degli strumenti e rilasciarla dopo l'attività DoWhile in modo che WriteLine sia l'attività finale nell'attività radice
Sequence
.Digitare l'espressione seguente nella casella della proprietà
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Per aggiornare WorkflowVersionMap in modo da includere le versioni precedenti del flusso di lavoro
Fare doppio clic su WorkflowVersionMap.cs (o WorkflowVersionMap.vb) nel progetto NumberGuessWorkflowHost per aprirlo.
Aggiungere le seguenti istruzioni
using
(oImports
) nella parte superiore del file con le altre istruzioniusing
(oImports
).Imports System.Reflection Imports System.IO
using System.Reflection; using System.IO;
Aggiungere tre nuove identità del flusso di lavoro subito dopo le tre dichiarazioni di identità del flusso di lavoro esistenti. Queste nuove identità del flusso di lavoro
v1
verranno usate per fornire la definizione corretta del flusso di lavoro ai flussi di lavoro avviati prima dell'applicazione degli aggiornamenti.'Current version identities. Public StateMachineNumberGuessIdentity As WorkflowIdentity Public FlowchartNumberGuessIdentity As WorkflowIdentity Public SequentialNumberGuessIdentity As WorkflowIdentity 'v1 Identities. Public StateMachineNumberGuessIdentity_v1 As WorkflowIdentity Public FlowchartNumberGuessIdentity_v1 As WorkflowIdentity Public SequentialNumberGuessIdentity_v1 As WorkflowIdentity
// Current version identities. static public WorkflowIdentity StateMachineNumberGuessIdentity; static public WorkflowIdentity FlowchartNumberGuessIdentity; static public WorkflowIdentity SequentialNumberGuessIdentity; // v1 identities. static public WorkflowIdentity StateMachineNumberGuessIdentity_v1; static public WorkflowIdentity FlowchartNumberGuessIdentity_v1; static public WorkflowIdentity SequentialNumberGuessIdentity_v1;
Nel costruttore
WorkflowVersionMap
, aggiornare la proprietàVersion
delle tre identità correnti del flusso di lavoro a2.0.0.0
.'Add the current workflow version identities. StateMachineNumberGuessIdentity = New WorkflowIdentity With { .Name = "StateMachineNumberGuessWorkflow", .Version = New Version(2, 0, 0, 0) } FlowchartNumberGuessIdentity = New WorkflowIdentity With { .Name = "FlowchartNumberGuessWorkflow", .Version = New Version(2, 0, 0, 0) } SequentialNumberGuessIdentity = New WorkflowIdentity With { .Name = "SequentialNumberGuessWorkflow", .Version = New Version(2, 0, 0, 0) } map.Add(StateMachineNumberGuessIdentity, New StateMachineNumberGuessWorkflow()) map.Add(FlowchartNumberGuessIdentity, New FlowchartNumberGuessWorkflow()) map.Add(SequentialNumberGuessIdentity, New SequentialNumberGuessWorkflow())
// Add the current workflow version identities. StateMachineNumberGuessIdentity = new WorkflowIdentity { Name = "StateMachineNumberGuessWorkflow", // Version = new Version(1, 0, 0, 0), Version = new Version(2, 0, 0, 0) }; FlowchartNumberGuessIdentity = new WorkflowIdentity { Name = "FlowchartNumberGuessWorkflow", // Version = new Version(1, 0, 0, 0), Version = new Version(2, 0, 0, 0) }; SequentialNumberGuessIdentity = new WorkflowIdentity { Name = "SequentialNumberGuessWorkflow", // Version = new Version(1, 0, 0, 0), Version = new Version(2, 0, 0, 0) }; map.Add(StateMachineNumberGuessIdentity, new StateMachineNumberGuessWorkflow()); map.Add(FlowchartNumberGuessIdentity, new FlowchartNumberGuessWorkflow()); map.Add(SequentialNumberGuessIdentity, new SequentialNumberGuessWorkflow());
Il codice che aggiunge le versioni correnti dei flussi di lavoro al dizionario usa le versioni correnti a cui si fa riferimento nel progetto, in modo che il codice che inizializza le definizioni dei flusso di lavoro non deve essere aggiornato.
Aggiungere il seguente codice nel costruttore immediatamente dopo il codice che aggiunge le versioni correnti al dizionario.
'Initialize the previous workflow version identities. StateMachineNumberGuessIdentity_v1 = New WorkflowIdentity With { .Name = "StateMachineNumberGuessWorkflow", .Version = New Version(1, 0, 0, 0) } FlowchartNumberGuessIdentity_v1 = New WorkflowIdentity With { .Name = "FlowchartNumberGuessWorkflow", .Version = New Version(1, 0, 0, 0) } SequentialNumberGuessIdentity_v1 = New WorkflowIdentity With { .Name = "SequentialNumberGuessWorkflow", .Version = New Version(1, 0, 0, 0) }
// Initialize the previous workflow version identities. StateMachineNumberGuessIdentity_v1 = new WorkflowIdentity { Name = "StateMachineNumberGuessWorkflow", Version = new Version(1, 0, 0, 0) }; FlowchartNumberGuessIdentity_v1 = new WorkflowIdentity { Name = "FlowchartNumberGuessWorkflow", Version = new Version(1, 0, 0, 0) }; SequentialNumberGuessIdentity_v1 = new WorkflowIdentity { Name = "SequentialNumberGuessWorkflow", Version = new Version(1, 0, 0, 0) };
Queste identità del flusso di lavoro sono associate alle versioni iniziali delle corrispondenti definizioni di flusso di lavoro.
Quindi, caricare l'assembly contenente la versione iniziale delle definizioni di flusso di lavoro e creare e aggiungere le definizioni corrispondenti di flusso di lavoro al dizionario.
'Add the previous version workflow identities to the dictionary along with 'the corresponding workflow definitions loaded from the v1 assembly. 'Assembly.LoadFile requires an absolute path so convert this relative path 'to an absolute path. Dim v1AssemblyPath As String = "..\..\..\PreviousVersions\NumberGuessWorkflowActivities_v1.dll" v1AssemblyPath = Path.GetFullPath(v1AssemblyPath) Dim v1Assembly As Assembly = Assembly.LoadFile(v1AssemblyPath) map.Add(StateMachineNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.StateMachineNumberGuessWorkflow")) map.Add(SequentialNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.SequentialNumberGuessWorkflow")) map.Add(FlowchartNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.FlowchartNumberGuessWorkflow"))
// Add the previous version workflow identities to the dictionary along with // the corresponding workflow definitions loaded from the v1 assembly. // Assembly.LoadFile requires an absolute path so convert this relative path // to an absolute path. string v1AssemblyPath = @"..\..\..\PreviousVersions\NumberGuessWorkflowActivities_v1.dll"; v1AssemblyPath = Path.GetFullPath(v1AssemblyPath); Assembly v1Assembly = Assembly.LoadFile(v1AssemblyPath); map.Add(StateMachineNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.StateMachineNumberGuessWorkflow") as Activity); map.Add(SequentialNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.SequentialNumberGuessWorkflow") as Activity); map.Add(FlowchartNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.FlowchartNumberGuessWorkflow") as Activity);
L'esempio seguente è l'elenco di codice per la classe
WorkflowVersionMap
aggiornata.Public Module WorkflowVersionMap Dim map As Dictionary(Of WorkflowIdentity, Activity) 'Current version identities. Public StateMachineNumberGuessIdentity As WorkflowIdentity Public FlowchartNumberGuessIdentity As WorkflowIdentity Public SequentialNumberGuessIdentity As WorkflowIdentity 'v1 Identities. Public StateMachineNumberGuessIdentity_v1 As WorkflowIdentity Public FlowchartNumberGuessIdentity_v1 As WorkflowIdentity Public SequentialNumberGuessIdentity_v1 As WorkflowIdentity Sub New() map = New Dictionary(Of WorkflowIdentity, Activity) 'Add the current workflow version identities. StateMachineNumberGuessIdentity = New WorkflowIdentity With { .Name = "StateMachineNumberGuessWorkflow", .Version = New Version(2, 0, 0, 0) } FlowchartNumberGuessIdentity = New WorkflowIdentity With { .Name = "FlowchartNumberGuessWorkflow", .Version = New Version(2, 0, 0, 0) } SequentialNumberGuessIdentity = New WorkflowIdentity With { .Name = "SequentialNumberGuessWorkflow", .Version = New Version(2, 0, 0, 0) } map.Add(StateMachineNumberGuessIdentity, New StateMachineNumberGuessWorkflow()) map.Add(FlowchartNumberGuessIdentity, New FlowchartNumberGuessWorkflow()) map.Add(SequentialNumberGuessIdentity, New SequentialNumberGuessWorkflow()) 'Initialize the previous workflow version identities. StateMachineNumberGuessIdentity_v1 = New WorkflowIdentity With { .Name = "StateMachineNumberGuessWorkflow", .Version = New Version(1, 0, 0, 0) } FlowchartNumberGuessIdentity_v1 = New WorkflowIdentity With { .Name = "FlowchartNumberGuessWorkflow", .Version = New Version(1, 0, 0, 0) } SequentialNumberGuessIdentity_v1 = New WorkflowIdentity With { .Name = "SequentialNumberGuessWorkflow", .Version = New Version(1, 0, 0, 0) } 'Add the previous version workflow identities to the dictionary along with 'the corresponding workflow definitions loaded from the v1 assembly. 'Assembly.LoadFile requires an absolute path so convert this relative path 'to an absolute path. Dim v1AssemblyPath As String = "..\..\..\PreviousVersions\NumberGuessWorkflowActivities_v1.dll" v1AssemblyPath = Path.GetFullPath(v1AssemblyPath) Dim v1Assembly As Assembly = Assembly.LoadFile(v1AssemblyPath) map.Add(StateMachineNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.StateMachineNumberGuessWorkflow")) map.Add(SequentialNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.SequentialNumberGuessWorkflow")) map.Add(FlowchartNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.FlowchartNumberGuessWorkflow")) End Sub Public Function GetWorkflowDefinition(identity As WorkflowIdentity) As Activity Return map(identity) End Function Public Function GetIdentityDescription(identity As WorkflowIdentity) As String Return identity.ToString() End Function End Module
public static class WorkflowVersionMap { static Dictionary<WorkflowIdentity, Activity> map; // Current version identities. static public WorkflowIdentity StateMachineNumberGuessIdentity; static public WorkflowIdentity FlowchartNumberGuessIdentity; static public WorkflowIdentity SequentialNumberGuessIdentity; // v1 identities. static public WorkflowIdentity StateMachineNumberGuessIdentity_v1; static public WorkflowIdentity FlowchartNumberGuessIdentity_v1; static public WorkflowIdentity SequentialNumberGuessIdentity_v1; static WorkflowVersionMap() { map = new Dictionary<WorkflowIdentity, Activity>(); // Add the current workflow version identities. StateMachineNumberGuessIdentity = new WorkflowIdentity { Name = "StateMachineNumberGuessWorkflow", // Version = new Version(1, 0, 0, 0), Version = new Version(2, 0, 0, 0) }; FlowchartNumberGuessIdentity = new WorkflowIdentity { Name = "FlowchartNumberGuessWorkflow", // Version = new Version(1, 0, 0, 0), Version = new Version(2, 0, 0, 0) }; SequentialNumberGuessIdentity = new WorkflowIdentity { Name = "SequentialNumberGuessWorkflow", // Version = new Version(1, 0, 0, 0), Version = new Version(2, 0, 0, 0) }; map.Add(StateMachineNumberGuessIdentity, new StateMachineNumberGuessWorkflow()); map.Add(FlowchartNumberGuessIdentity, new FlowchartNumberGuessWorkflow()); map.Add(SequentialNumberGuessIdentity, new SequentialNumberGuessWorkflow()); // Initialize the previous workflow version identities. StateMachineNumberGuessIdentity_v1 = new WorkflowIdentity { Name = "StateMachineNumberGuessWorkflow", Version = new Version(1, 0, 0, 0) }; FlowchartNumberGuessIdentity_v1 = new WorkflowIdentity { Name = "FlowchartNumberGuessWorkflow", Version = new Version(1, 0, 0, 0) }; SequentialNumberGuessIdentity_v1 = new WorkflowIdentity { Name = "SequentialNumberGuessWorkflow", Version = new Version(1, 0, 0, 0) }; // Add the previous version workflow identities to the dictionary along with // the corresponding workflow definitions loaded from the v1 assembly. // Assembly.LoadFile requires an absolute path so convert this relative path // to an absolute path. string v1AssemblyPath = @"..\..\..\PreviousVersions\NumberGuessWorkflowActivities_v1.dll"; v1AssemblyPath = Path.GetFullPath(v1AssemblyPath); Assembly v1Assembly = Assembly.LoadFile(v1AssemblyPath); map.Add(StateMachineNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.StateMachineNumberGuessWorkflow") as Activity); map.Add(SequentialNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.SequentialNumberGuessWorkflow") as Activity); map.Add(FlowchartNumberGuessIdentity_v1, v1Assembly.CreateInstance("NumberGuessWorkflowActivities.FlowchartNumberGuessWorkflow") as Activity); } public static Activity GetWorkflowDefinition(WorkflowIdentity identity) { return map[identity]; } public static string GetIdentityDescription(WorkflowIdentity identity) { return identity.ToString(); } }
Per compilare ed eseguire l'applicazione
Premere CTRL+MAIUSC+B per compilare l'applicazione, quindi premere CTRL+F5 per avviarla.
Avviare un nuovo flusso di lavoro facendo clic su Nuova partita. La versione del flusso di lavoro viene visualizzata nella finestra di stato e riflette la versione aggiornata dall'oggetto
WorkflowIdentity
associato. Prendere nota diInstanceId
in modo da poter visualizzare il file di traccia per il flusso di lavoro quando viene completato e quindi immettere i tentativi fino al termine del gioco. Si noti in che modo la stima dell'utente viene visualizzata tra le informazioni riportate nella finestra di stato in base agli aggiornamenti alle attivitàWriteLine
.Please enter a number between 1 and 10 5 is too high. Please enter a number between 1 and 10 3 is too high. Please enter a number between 1 and 10 1 is too low. Please enter a number between 1 and 10 Congratulations, you guessed the number in 4 turns.
Nota
Viene visualizzato il testo aggiornato dalle attività
WriteLine
, ma non l'output dell'attività finaleWriteLine
aggiunta in questo argomento. Ciò accade perché la finestra di stato viene aggiornata dal gestorePersistableIdle
. Poiché il flusso di lavoro viene completato e non risulta inattivo dopo l'attività finale, il gestorePersistableIdle
non viene chiamato. Tuttavia, viene visualizzato un messaggio simile nella finestra di stato dal gestoreCompleted
. Se necessario, è possibile aggiungere il codice al gestoreCompleted
per estrarre il testo daStringWriter
e per visualizzarlo nella finestra di stato.Aprire Esplora risorse e passare alla cartella NumberGuessWorkflowHost\bin\debug (o bin\release a seconda delle impostazioni del progetto), quindi aprire il file di rilevamento mediante Blocco note corrispondente al flusso di lavoro completato. Se non si è preso nota dell'oggetto
InstanceId
, è possibile identificare il file di rilevamento corretto usando le informazioni in Data ultima modifica in Esplora soluzioni.Please enter a number between 1 and 10 5 is too high. Please enter a number between 1 and 10 3 is too high. Please enter a number between 1 and 10 1 is too low. Please enter a number between 1 and 10 2 is correct. You guessed it in 4 turns.
L'output di
WriteLine
aggiornato è contenuto nel file di rilevamento, incluso l'output diWriteLine
aggiornato in questo argomento.Passare di nuovo all'applicazione per determinare il numero e selezionare uno dei flussi di lavoro avviato prima dell'applicazione degli aggiornamenti. È possibile identificare la versione del flusso di lavoro attualmente selezionato esaminando le informazioni sulla versione visualizzate nella finestra di stato. Immettere alcuni tentativi e notare che gli aggiornamenti di stato corrispondono all'output dell'attività
WriteLine
della versione precedente e non includono il tentativo dell'utente. Questo perché questi flussi di lavoro usano la definizione precedente del flusso di lavoro che non presenta gli aggiornamenti diWriteLine
.Nel passaggio successivo, Procedura: Aggiornare la definizione di un'istanza del flusso di lavoro in esecuzione, le istanze del flusso di lavoro
v1
in esecuzione vengono aggiornate in modo che contengano le nuove funzionalità come istanzev2
.