Anvisningar: Hantera flera versioner av ett arbetsflöde sida vid sida
WorkflowIdentity
tillhandahåller ett sätt för utvecklare av arbetsflödesprogram att associera ett namn och en version med en arbetsflödesdefinition, och för att den här informationen ska associeras med en bevarad arbetsflödesinstans. Den här identitetsinformationen kan användas av utvecklare av arbetsflödesprogram för att aktivera scenarier, till exempel körning sida vid sida av flera versioner av en arbetsflödesdefinition, och utgör hörnstenen för andra funktioner, till exempel dynamisk uppdatering. Det här steget i självstudien visar hur du använder för att vara WorkflowIdentity
värd för flera versioner av ett arbetsflöde samtidigt.
I det här avsnittet
I det här steget i självstudien ändras aktiviteterna WriteLine
i arbetsflödet för att ge ytterligare information och en ny WriteLine
aktivitet läggs till. En kopia av den ursprungliga arbetsflödessammansättningen lagras och värdprogrammet uppdateras så att det kan köra både ursprungliga och uppdaterade arbetsflöden samtidigt.
Så här gör du en kopia av projektet NumberGuessWorkflowActivities
Så här uppdaterar du WorkflowVersionMap för att inkludera tidigare arbetsflödesversioner
Kommentar
Innan du följer stegen i det här avsnittet kör du programmet, startar flera arbetsflöden av varje typ och gör en eller två gissningar för var och en. Dessa bevarade arbetsflöden används i det här steget och följande steg: Så här uppdaterar du definitionen av en arbetsflödesinstans som körs.
Så här gör du en kopia av projektet NumberGuessWorkflowActivities
Öppna lösningen WF45GettingStartedTutorial i Visual Studio 2012 om den inte är öppen.
Tryck på CTRL+SKIFT+B för att skapa lösningen.
Stäng lösningen WF45GettingStartedTutorial.
Öppna Utforskaren och navigera till mappen där självstudiekursens lösningsfil och projektmapparna finns.
Skapa en ny mapp med namnet PreviousVersions i samma mapp som NumberGuessWorkflowHost och NumberGuessWorkflowActivities. Den här mappen används för att innehålla de sammansättningar som innehåller de olika versionerna av arbetsflödena som används i de efterföljande självstudierna.
Gå till mappen NumberGuessWorkflowActivities\bin\debug (eller bin\release beroende på dina projektinställningar). Kopiera NumberGuessWorkflowActivities.dll och klistra in den i mappen PreviousVersions .
Byt namn på NumberGuessWorkflowActivities.dll i mappen PreviousVersions till NumberGuessWorkflowActivities_v1.dll.
Kommentar
Stegen i det här avsnittet visar ett sätt att hantera de sammansättningar som används för att innehålla flera versioner av arbetsflödena. Andra metoder som att namnge sammansättningarna och registrera dem i den globala sammansättningscachen kan också användas.
Skapa en ny mapp med namnet NumberGuessWorkflowActivities_du i samma mapp som NumberGuessWorkflowHost, NumberGuessWorkflowActivities och den nyligen tillagda mappen PreviousVersions och kopiera alla filer och undermappar från mappen NumberGuessWorkflowActivities till den nya mappen NumberGuessWorkflowActivities_du . Den här säkerhetskopian av projektet för den första versionen av aktiviteterna används i Så här uppdaterar du definitionen av en arbetsflödesinstans som körs.
Öppna WF45GettingStartedTutorial-lösningen igen i Visual Studio 2012.
Uppdatera arbetsflödena
I det här avsnittet uppdateras arbetsflödesdefinitionerna. De två WriteLine
aktiviteter som ger feedback om användarens gissning uppdateras och en ny WriteLine
aktivitet läggs till som ger ytterligare information om spelet när talet har gissats.
Så här uppdaterar du StateMachine-arbetsflödet
Dubbelklicka på StateMachineNumberGuessWorkflow.xaml under projektet NumberGuessWorkflowActivities i Solution Explorer.
Dubbelklicka på övergången Gissa fel på tillståndsdatorn.
Uppdatera den
Text
vänstra delenWriteLine
iIf
aktiviteten.Guess & " is too low."
Guess + " is too low."
Uppdatera de
Text
mestWriteLine
högra iIf
aktiviteten.Guess & " is too high."
Guess + " is too high."
Gå tillbaka till den övergripande tillståndsdatorvyn i arbetsflödesdesignern genom att klicka på StateMachine i sökvägsvisningen överst i arbetsflödesdesignern.
Dubbelklicka på övergången Gissa rätt på tillståndsdatorn.
Dra en WriteLine-aktivitet från avsnittet Primitiver i verktygslådanoch släpp den på etiketten Släpp åtgärd här för övergången.
Skriv följande uttryck i egenskapsrutan
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Så här uppdaterar du arbetsflödet för flödesschemat
Dubbelklicka på FlowchartNumberGuessWorkflow.xaml under projektet NumberGuessWorkflowActivities i Solution Explorer.
Uppdatera aktiviteten
Text
till vänsterWriteLine
.Guess & " is too low."
Guess + " is too low."
Uppdatera aktiviteten
Text
för den mestWriteLine
högra aktiviteten.Guess & " is too high."
Guess + " is too high."
Dra en WriteLine-aktivitet från avsnittet Primitiver i verktygslådan och släpp den på släpppunkten för
True
åtgärden i den överstaFlowDecision
. AktivitetenWriteLine
läggs till i flödesschemat och länkas tillTrue
åtgärden förFlowDecision
.Skriv följande uttryck i egenskapsrutan
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Uppdatera det sekventiella arbetsflödet
Under projektet NumberGuessWorkflowActivities i Solution Explorer dubbelklickar du på SekventielltNumberGuessWorkflow.xaml.
Uppdatera den
Text
vänstra delenWriteLine
iIf
aktiviteten.Guess & " is too low."
Guess + " is too low."
Uppdatera aktivitetens
Text
mest högraWriteLine
aktivitet iIf
aktiviteten.Guess & " is too high."
Guess + " is too high."
Dra en WriteLine-aktivitet från avsnittet Primitiver i verktygslådan och släpp den efter DoWhile-aktiviteten så att WriteLine är den sista aktiviteten i rotaktiviteten
Sequence
.Skriv följande uttryck i egenskapsrutan
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Så här uppdaterar du WorkflowVersionMap för att inkludera tidigare arbetsflödesversioner
Dubbelklicka på WorkflowVersionMap.cs (eller WorkflowVersionMap.vb) under projektet NumberGuessWorkflowHost för att öppna det.
Lägg till följande
using
(ellerImports
) -instruktioner överst i filen med de andrausing
(ellerImports
) -uttrycken.Imports System.Reflection Imports System.IO
using System.Reflection; using System.IO;
Lägg till tre nya arbetsflödesidentiteter precis under de tre befintliga arbetsflödesidentitetsdeklarationerna. Dessa nya
v1
arbetsflödesidentiteter kommer att användas för att ange rätt arbetsflödesdefinition för arbetsflöden som startades innan uppdateringarna gjordes.'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;
WorkflowVersionMap
I konstruktorn uppdaterar du egenskapen förVersion
de tre aktuella arbetsflödesidentiteterna till2.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());
Koden i som lägger till de aktuella versionerna av arbetsflödena i ordlistan använder de aktuella versioner som refereras i projektet, så koden som initierar arbetsflödesdefinitionerna behöver inte uppdateras.
Lägg till följande kod i konstruktorn strax efter koden som lägger till de aktuella versionerna i ordlistan.
'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) };
Dessa arbetsflödesidentiteter är associerade med de första versionerna av motsvarande arbetsflödesdefinitioner.
Läs sedan in sammansättningen som innehåller den första versionen av arbetsflödesdefinitionerna och skapa och lägg till motsvarande arbetsflödesdefinitioner i ordlistan.
'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);
Följande exempel är den fullständiga listan för den uppdaterade
WorkflowVersionMap
klassen.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(); } }
Skapa och köra programmet
Tryck på CTRL+SKIFT+B för att skapa programmet och starta sedan CTRL+F5.
Starta ett nytt arbetsflöde genom att klicka på Nytt spel. Versionen av arbetsflödet visas under statusfönstret och återspeglar den uppdaterade versionen från den associerade
WorkflowIdentity
. AntecknaInstanceId
så att du kan visa spårningsfilen för arbetsflödet när det är klart och ange sedan gissningar tills spelet är klart. Observera hur användarens gissning visas i informationen som visas i statusfönstret baserat på uppdateringarna av aktiviteternaWriteLine
.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.
Kommentar
Den uppdaterade texten från aktiviteterna
WriteLine
visas, men utdata från den slutligaWriteLine
aktiviteten som lades till i det här avsnittet är inte det. Det beror på att statusfönstret uppdateras avPersistableIdle
hanteraren. Eftersom arbetsflödet slutförs och inte går inaktivt efter den slutliga aktivitetenPersistableIdle
anropas inte hanteraren. Ett liknande meddelande visas dock i statusfönstret avCompleted
hanteraren. Om du vill kan kod läggas till iCompleted
hanteraren för att extrahera texten frånStringWriter
och visa den i statusfönstret.Öppna Utforskaren och gå till mappen NumberGuessWorkflowHost\bin\debug (eller bin\release beroende på projektinställningarna) och öppna spårningsfilen med Anteckningar som motsvarar det slutförda arbetsflödet. Om du inte antecknar kan du identifiera rätt spårningsfil med hjälp av den datum ändrade informationen i Utforskaren.
InstanceId
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.
De uppdaterade
WriteLine
utdata finns i spårningsfilen, inklusive utdata frånWriteLine
det som lades till i det här avsnittet.Växla tillbaka till programmet för nummer gissa och välj ett av de arbetsflöden som startades innan uppdateringarna gjordes. Du kan identifiera versionen av det valda arbetsflödet genom att titta på versionsinformationen som visas under statusfönstret. Ange några gissningar och observera att statusuppdateringarna matchar
WriteLine
aktivitetsutdata från den tidigare versionen och ta inte med användarens gissning. Det beror på att dessa arbetsflöden använder den tidigare arbetsflödesdefinitionen som inte har uppdateringarnaWriteLine
.I nästa steg, How to: Update the Definition of a Running Workflow Instance, uppdateras de arbetsflödesinstanser som körs
v1
så att de innehåller de nya funktionerna somv2
instanser.