Postupy: Hostování několika verzí pracovního postupu současně
WorkflowIdentity
poskytuje vývojářům aplikací pracovních postupů způsob, jak přidružit název a verzi k definici pracovního postupu a aby tyto informace byly přidruženy k trvalé instanci pracovního postupu. Tyto informace o identitě můžou vývojáři aplikací pracovních postupů používat k povolení scénářů, jako je souběžné spouštění více verzí definice pracovního postupu, a poskytuje základní kámen pro další funkce, jako je dynamická aktualizace. Tento krok v kurzu ukazuje, jak používat WorkflowIdentity
k hostování více verzí pracovního postupu najednou.
V tomto tématu
V tomto kroku kurzu se aktivity v pracovním postupu upraví tak, WriteLine
aby poskytovaly další informace a přidá se nová WriteLine
aktivita. Uloží se kopie původního sestavení pracovního postupu a hostitelská aplikace se aktualizuje, aby bylo možné spustit původní i aktualizované pracovní postupy současně.
Poznámka:
Před provedením kroků v tomto tématu spusťte aplikaci, spusťte několik pracovních postupů každého typu a proveďte jeden nebo dva odhady pro každý z nich. Tyto trvalé pracovní postupy se používají v tomto kroku a v následujícím kroku: Aktualizace definice spuštěné instance pracovního postupu.
Vytvoření kopie projektu NumberGuessWorkflowActivities
Otevřete řešení WF45GettingStartedTutorial v sadě Visual Studio 2012, pokud není otevřené.
Stisknutím kláves CTRL+SHIFT+B řešení sestavíte.
Zavřete řešení WF45GettingStartedTutorial.
Otevřete Průzkumníka Windows a přejděte do složky, kde se nachází soubor řešení kurzu a složky projektu.
Vytvořte novou složku s názvem PreviousVersions ve stejné složce jako NumberGuessWorkflowHost a NumberGuessWorkflowActivities. Tato složka slouží k zahrnutí sestavení, která obsahují různé verze pracovních postupů použitých v dalších krocích kurzu.
Přejděte do složky NumberGuessWorkflowActivities\bin\debug (nebo bin\release v závislosti na nastavení projektu). Zkopírujte NumberGuessWorkflowActivities.dll a vložte ho do složky PreviousVersions .
Přejmenujte NumberGuessWorkflowActivities.dll ve složce PreviousVersions na NumberGuessWorkflowActivities_v1.dll.
Poznámka:
Kroky v tomto tématu ukazují jeden ze způsobů, jak spravovat sestavení používaná k zahrnutí více verzí pracovních postupů. Lze také použít jiné metody, jako je silné pojmenování sestavení a jejich registrace v globální mezipaměti sestavení.
Vytvořte novou složku s názvem NumberGuessWorkflowActivities_du ve stejné složce jako NumberGuessWorkflowHost, NumberGuessWorkflowActivities a nově přidanou složku PreviousVersions a zkopírujte všechny soubory a podsložky ze složky NumberGuessWorkflowActivities do nové složky NumberGuessWorkflowActivities_du . Tato záložní kopie projektu pro počáteční verzi aktivit se používá v části Postupy: Aktualizace definice spuštěné instance pracovního postupu.
Znovu otevřete řešení WF45GettingStartedTutorial v sadě Visual Studio 2012.
Aktualizace pracovních postupů
V této části se aktualizují definice pracovního postupu. WriteLine
Dvě aktivity, které poskytují zpětnou vazbu k odhadu uživatele, se aktualizují a přidá se nová WriteLine
aktivita, která po odhadu čísla poskytne další informace o hře.
Aktualizace pracovního postupu StateMachine
V Průzkumník řešení v části NumberGuessWorkflowActivities projektu poklikejte na StateMachineNumberGuessWorkflow.xaml.
Poklikejte na přechod Nesprávný odhad na stavovém počítači.
Text
Aktualizujte aktivituIf
úplně vlevoWriteLine
.Guess & " is too low."
Guess + " is too low."
Text
Aktualizujte v aktivitěIf
nejvíce vpravoWriteLine
.Guess & " is too high."
Guess + " is too high."
Vraťte se do zobrazení počítače celkového stavu v návrháři pracovního postupu kliknutím na StateMachine v zobrazení s popisem cesty v horní části návrháře pracovního postupu.
Poklikejte na přechod Pro odhad správnosti na stavovém počítači.
Přetáhněte aktivitu WriteLine z části Primitives v sadě nástrojů a přesuňte ji na popisek akce přetažení sem popisek přechodu.
Do pole vlastnosti zadejte následující výraz
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Aktualizace pracovního postupu vývojového diagramu
V Průzkumník řešení v rámci projektu NumberGuessWorkflowActivities poklikejte na FlowchartNumberGuessWorkflow.xaml.
Text
Aktualizujte aktivitu nejvíce vlevoWriteLine
.Guess & " is too low."
Guess + " is too low."
Text
Aktualizujte správnouWriteLine
aktivitu.Guess & " is too high."
Guess + " is too high."
Přetáhněte aktivitu WriteLine z části Primitives panelu nástrojů a přesuňte ji do bodu přetažení
True
akce nejvíceFlowDecision
nahoře . AktivitaWriteLine
se přidá do vývojového diagramu a je propojená sTrue
akcí objektuFlowDecision
.Do pole vlastnosti zadejte následující výraz
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Aktualizace sekvenčního pracovního postupu
V Průzkumník řešení v části NumberGuessWorkflowActivities projektu poklikejte na SequenceNumberGuessWorkflow.xaml.
Text
Aktualizujte aktivituIf
úplně vlevoWriteLine
.Guess & " is too low."
Guess + " is too low."
Text
Aktualizujte aktivitu nejvíce vpravoWriteLine
v aktivitěIf
.Guess & " is too high."
Guess + " is too high."
Přetáhněte aktivitu WriteLine z části Primitives panelu nástrojů a přesuňte ji za aktivitu DoWhile tak, aby WriteLine je konečná aktivita v kořenové
Sequence
aktivitě.Do pole vlastnosti zadejte následující výraz
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Aktualizace WorkflowVersionMap tak, aby zahrnovala předchozí verze pracovního postupu
Poklikáním otevřete WorkflowVersionMap.cs (nebo WorkflowVersionMap.vb) v projektu NumberGuessWorkflowHost .
Na začátek souboru přidejte následující
using
příkazy (neboImports
) s jinýmiusing
příkazy (neboImports
).Imports System.Reflection Imports System.IO
using System.Reflection; using System.IO;
Přidejte tři nové identity pracovního postupu těsně pod tři existující deklarace identity pracovního postupu. Tyto nové
v1
identity pracovního postupu budou použity, aby byly pracovní postupy spuštěny před provedením aktualizací správné definice pracovního postupu.'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;
V konstruktoru
WorkflowVersionMap
Version
aktualizujte vlastnost tří aktuálních identit pracovního postupu na2.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());
Kód, který přidá aktuální verze pracovních postupů do slovníku, používá aktuální verze odkazované v projektu, takže kód, který inicializuje definice pracovního postupu, není nutné aktualizovat.
Do konstruktoru přidejte následující kód hned za kód, který přidá aktuální verze do slovníku.
'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) };
Tyto identity pracovního postupu jsou přidruženy k počátečním verzím odpovídajících definic pracovního postupu.
Dále načtěte sestavení, které obsahuje počáteční verzi definic pracovních postupů, a vytvořte a přidejte odpovídající definice pracovního postupu do slovníku.
'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);
Následující příklad je úplný výpis aktualizované
WorkflowVersionMap
třídy.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(); } }
Sestavení a spuštění aplikace
Stisknutím kombinace kláves CTRL+SHIFT+B sestavte aplikaci a pak ji spusťte stisknutím kombinace kláves CTRL+F5.
Kliknutím na Nová hra zahájíte nový pracovní postup. Verze pracovního postupu se zobrazí v okně stavu a odráží aktualizovanou verzi z přidruženého
WorkflowIdentity
. PoznamenejteInstanceId
si soubor sledování pracovního postupu po dokončení a zadejte odhady, dokud hra nebude dokončena. Všimněte si, jak se odhad uživatele zobrazí v informacích zobrazených v okně stavu na základě aktualizacíWriteLine
aktivit.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.
Poznámka:
Zobrazí se aktualizovaný text z
WriteLine
aktivit, ale výstup posledníWriteLine
aktivity přidané v tomto tématu není. Důvodem je, že obslužná rutina aktualizuje stavovéPersistableIdle
okno. Vzhledem k tomu, že se pracovní postup dokončí a po závěrečné aktivitě nečiní, obslužná rutinaPersistableIdle
se nevolá. Obslužná rutina ale zobrazí podobnou zprávu v okněCompleted
stavu. V případě potřeby lze doCompleted
obslužné rutiny přidat kód, který extrahuje text zStringWriter
okna stavu a zobrazí ho.Otevřete Průzkumníka Windows a přejděte do složky NumberGuessWorkflowHost\bin\debug (nebo bin\release v závislosti na nastavení projektu) a otevřete sledovací soubor pomocí Poznámkový blok, který odpovídá dokončeným pracovnímu postupu. Pokud jste si tuto zprávu nevšimli, můžete pomocí informací o změně data v Průzkumníku
InstanceId
Windows identifikovat správný sledovací soubor.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.
Aktualizovaný
WriteLine
výstup je obsažen v souboru sledování, včetně výstupuWriteLine
přidaného v tomto tématu.Přepněte zpět na aplikaci pro hádání čísel a vyberte jeden z pracovních postupů, které byly zahájeny před provedením aktualizací. Verzi aktuálně vybraného pracovního postupu můžete identifikovat tak, že se podíváte na informace o verzi zobrazené pod oknem stavu. Zadejte nějaké odhady a všimněte si, že aktualizace stavu odpovídají výstupu
WriteLine
aktivity z předchozí verze a nezahrnují odhad uživatele. Je to proto, že tyto pracovní postupy používají předchozí definici pracovního postupu, která neobsahujeWriteLine
aktualizace.V dalším kroku Postupy : Aktualizace definice spuštěné instance pracovního postupu, spuštěné
v1
instance pracovního postupu jsou aktualizovány tak, aby obsahovaly nové funkce jakov2
instance.