Procedure: Meerdere versies van een werkstroom naast elkaar hosten
WorkflowIdentity
biedt ontwikkelaars van werkstroomtoepassingen een manier om een naam en versie te koppelen aan een werkstroomdefinitie en om deze informatie te koppelen aan een persistent werkstroomexemplaar. Deze identiteitsgegevens kunnen door ontwikkelaars van werkstroomtoepassingen worden gebruikt om scenario's mogelijk te maken, zoals het naast elkaar uitvoeren van meerdere versies van een werkstroomdefinitie, en biedt de hoeksteen voor andere functionaliteit, zoals dynamische updates. Deze stap in de zelfstudie laat zien hoe WorkflowIdentity
u meerdere versies van een werkstroom tegelijkertijd kunt hosten.
In dit onderwerp
In deze stap van de zelfstudie worden de WriteLine
activiteiten in de werkstroom gewijzigd om aanvullende informatie te geven en wordt er een nieuwe WriteLine
activiteit toegevoegd. Er wordt een kopie van de oorspronkelijke werkstroomassembly opgeslagen en de hosttoepassing wordt bijgewerkt, zodat zowel de oorspronkelijke als de bijgewerkte werkstromen tegelijkertijd kunnen worden uitgevoerd.
Een kopie maken van het project NumberGuessWorkflowActivities
WorkflowVersionMap bijwerken om de vorige werkstroomversies op te nemen
Notitie
Voordat u de stappen in dit onderwerp volgt, voert u de toepassing uit, start u verschillende werkstromen van elk type en maakt u een of twee schattingen voor elk type. Deze persistente werkstromen worden gebruikt in deze stap en de volgende stap: De definitie van een actief werkstroomexemplaren bijwerken.
Een kopie maken van het project NumberGuessWorkflowActivities
Open de oplossing WF45GettingStartedTutorial in Visual Studio 2012 als deze niet is geopend.
Druk op CTRL + SHIFT + B om de oplossing te bouwen.
Sluit de WF45GettingStartedTutorial-oplossing .
Open Windows Verkenner en navigeer naar de map waarin het oplossingsbestand voor de zelfstudie en de projectmappen zich bevinden.
Maak een nieuwe map met de naam PreviousVersions in dezelfde map als NumberGuessWorkflowHost en NumberGuessWorkflowActivities. Deze map wordt gebruikt om de assembly's te bevatten die de verschillende versies van de werkstromen bevatten die in de volgende zelfstudiestappen worden gebruikt.
Navigeer naar de map NumberGuessWorkflowActivities\bin\debug (of bin\release , afhankelijk van uw projectinstellingen). Kopieer NumberGuessWorkflowActivities.dll en plak deze in de map PreviousVersions .
Wijzig de naam van NumberGuessWorkflowActivities.dll in de map PreviousVersions in NumberGuessWorkflowActivities_v1.dll.
Notitie
De stappen in dit onderwerp laten zien hoe u de assembly's kunt beheren die worden gebruikt om meerdere versies van de werkstromen te bevatten. Andere methoden, zoals het sterk benoemen van de assembly's en het registreren ervan in de globale assemblycache, kunnen ook worden gebruikt.
Maak een nieuwe map met de naam NumberGuessWorkflowActivities_du in dezelfde map als NumberGuessWorkflowHost, NumberGuessWorkflowActivities en de zojuist toegevoegde map PreviousVersions, en kopieer alle bestanden en submappen uit de map NumberGuessWorkflowActivities naar de nieuwe map NumberGuessWorkflowActivities_du. Deze back-upkopie van het project voor de eerste versie van de activiteiten wordt gebruikt in Procedure: De definitie van een actieve werkstroomexemplaar bijwerken.
Open de WF45GettingStartedTutorial-oplossing opnieuw in Visual Studio 2012.
De werkstromen bijwerken
In deze sectie worden de werkstroomdefinities bijgewerkt. De twee WriteLine
activiteiten die feedback geven over de schatting van de gebruiker, worden bijgewerkt en er wordt een nieuwe WriteLine
activiteit toegevoegd die aanvullende informatie over het spel biedt zodra het getal wordt geraden.
De StateMachine-werkstroom bijwerken
Dubbelklik in Solution Explorer onder het project NumberGuessWorkflowActivities op StateMachineNumberGuessWorkflow.xaml.
Dubbelklik op de onjuiste overgang raden op de statusmachine.
Werk de
Text
meestWriteLine
linkse in deIf
activiteit bij.Guess & " is too low."
Guess + " is too low."
Werk de
Text
meestWriteLine
rechtse in deIf
activiteit bij.Guess & " is too high."
Guess + " is too high."
Ga terug naar de weergave voor de algemene statusmachine in de werkstroomontwerper door boven aan de werkstroomontwerper op StateMachine te klikken in de breadcrumb-weergave.
Dubbelklik op de overgang Schatting juist op de statusmachine.
Sleep een WriteLine-activiteit uit de sectie Primitieven van de Werkset en zet deze neer op de activiteit Actie neerzetten hier het label van de overgang.
Typ de volgende expressie in het
Text
eigenschappenvak.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
De werkstroom stroomdiagram bijwerken
Dubbelklik in Solution Explorer onder het project NumberGuessWorkflowActivities op FlowchartNumberGuessWorkflow.xaml.
Werk de
Text
meestWriteLine
linkse activiteit bij.Guess & " is too low."
Guess + " is too low."
Werk de
Text
meestWriteLine
rechtse activiteit bij.Guess & " is too high."
Guess + " is too high."
Sleep een WriteLine-activiteit vanuit de sectie Primitieven van de Werkset en zet deze neer op het neerzetten van de
True
actie van de bovensteFlowDecision
. DeWriteLine
activiteit wordt toegevoegd aan het stroomdiagram en gekoppeld aan deTrue
actie van deFlowDecision
.Typ de volgende expressie in het
Text
eigenschappenvak.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
De sequentiële werkstroom bijwerken
Dubbelklik in Solution Explorer onder het project NumberGuessWorkflowActivities op SequentialNumberGuessWorkflow.xaml.
Werk de
Text
meestWriteLine
linkse in deIf
activiteit bij.Guess & " is too low."
Guess + " is too low."
Werk de
Text
meestWriteLine
rechtse activiteit in deIf
activiteit bij.Guess & " is too high."
Guess + " is too high."
Sleep een WriteLine-activiteit uit de sectie Primitieven van de Werkset en zet deze neer na de Activiteit DoWhile , zodat de WriteLine de laatste activiteit in de hoofdactiviteit
Sequence
is.Typ de volgende expressie in het
Text
eigenschappenvak.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
WorkflowVersionMap bijwerken om de vorige werkstroomversies op te nemen
Dubbelklik op WorkflowVersionMap.cs (of WorkflowVersionMap.vb) onder het project NumberGuessWorkflowHost om het te openen.
Voeg de volgende
using
(ofImports
) instructies toe aan het begin van het bestand met de andereusing
(ofImports
) instructies.Imports System.Reflection Imports System.IO
using System.Reflection; using System.IO;
Voeg drie nieuwe werkstroomidentiteiten toe, net onder de drie bestaande declaraties van werkstroomidentiteiten. Deze nieuwe
v1
werkstroomidentiteiten worden gebruikt, bieden de juiste werkstroomdefinitie voor werkstromen die zijn gestart voordat de updates zijn gemaakt.'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;
Werk in de
WorkflowVersionMap
constructor deVersion
eigenschap van de drie huidige werkstroomidentiteiten bij naar2.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());
De code in die de huidige versies van de werkstromen toevoegt aan de woordenlijst, gebruikt de huidige versies waarnaar in het project wordt verwezen, zodat de code waarmee de werkstroomdefinities worden geïnitialiseerd, niet hoeft te worden bijgewerkt.
Voeg de volgende code toe aan de constructor net na de code waarmee de huidige versies aan de woordenlijst worden toegevoegd.
'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) };
Deze werkstroomidentiteiten zijn gekoppeld aan de eerste versies van de bijbehorende werkstroomdefinities.
Laad vervolgens de assembly die de eerste versie van de werkstroomdefinities bevat, en maak en voeg de bijbehorende werkstroomdefinities toe aan de woordenlijst.
'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);
Het volgende voorbeeld is de volledige vermelding voor de bijgewerkte
WorkflowVersionMap
klasse.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(); } }
De toepassing bouwen en uitvoeren
Druk op Ctrl+Shift+B om de toepassing te bouwen en druk vervolgens op Ctrl+F5 om te starten.
Start een nieuwe werkstroom door op New Game te klikken. De versie van de werkstroom wordt weergegeven onder het statusvenster en weerspiegelt de bijgewerkte versie van de bijbehorende
WorkflowIdentity
. Noteer hetInstanceId
, zodat u het traceringsbestand voor de werkstroom kunt bekijken wanneer deze is voltooid en voer vervolgens schattingen in totdat het spel is voltooid. Let op hoe de schatting van de gebruiker wordt weergegeven in de informatie die wordt weergegeven in het statusvenster op basis van de updates voor deWriteLine
activiteiten.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.
Notitie
De bijgewerkte tekst van de
WriteLine
activiteiten wordt weergegeven, maar de uitvoer van de uiteindelijkeWriteLine
activiteit die in dit onderwerp is toegevoegd, is niet. Dat komt doordat het statusvenster wordt bijgewerkt door dePersistableIdle
handler. Omdat de werkstroom is voltooid en niet inactief gaat na de laatste activiteit, wordt dePersistableIdle
handler niet aangeroepen. Er wordt echter een vergelijkbaar bericht weergegeven in het statusvenster door deCompleted
handler. Indien gewenst kan code worden toegevoegd aan deCompleted
handler om de tekst uit deStringWriter
handler te extraheren en weer te geven aan het statusvenster.Open Windows Verkenner en navigeer naar de map NumberGuessWorkflowHost\bin\debug (of bin\release, afhankelijk van uw projectinstellingen) en open het traceringsbestand met behulp van Kladblok die overeenkomt met de voltooide werkstroom. Als u geen notitie hebt gemaakt van het
InstanceId
bestand, kunt u het juiste traceringsbestand identificeren met behulp van de gewijzigde gegevens in Windows Verkenner.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 bijgewerkte
WriteLine
uitvoer bevindt zich in het traceringsbestand, inclusief de uitvoer van deWriteLine
uitvoer die in dit onderwerp is toegevoegd.Ga terug naar de toepassing voor het raden van getallen en selecteer een van de werkstromen die zijn gestart voordat de updates werden uitgevoerd. U kunt de versie van de geselecteerde werkstroom identificeren door de versiegegevens te bekijken die onder het statusvenster worden weergegeven. Voer enkele schattingen in en merk op dat de statusupdates overeenkomen met de
WriteLine
activiteitsuitvoer van de vorige versie en niet de schatting van de gebruiker bevatten. Dat komt doordat deze werkstromen de vorige werkstroomdefinitie gebruiken die niet over deWriteLine
updates beschikt.In de volgende stap: De definitie van een exemplaar van een actieve werkstroom bijwerken, worden de actieve
v1
werkstroomexemplaren bijgewerkt, zodat ze de nieuwe functionaliteit als dev2
exemplaren bevatten.