Nasıl yapılır: İş Akışının Birden Fazla Sürümünü Yan Yana Barındırma
WorkflowIdentity
, iş akışı uygulaması geliştiricilerinin bir adı ve sürümü iş akışı tanımıyla ilişkilendirmesi ve bu bilgilerin kalıcı bir iş akışı örneğiyle ilişkilendirilmesi için bir yol sağlar. Bu kimlik bilgileri, iş akışı uygulama geliştiricileri tarafından bir iş akışı tanımının birden çok sürümünün yan yana yürütülmesi gibi senaryoları etkinleştirmek için kullanılabilir ve dinamik güncelleştirme gibi diğer işlevler için köşe taşını sağlar. Öğreticideki bu adım, bir iş akışının birden çok sürümünü aynı anda barındırmak için nasıl kullanılacağını WorkflowIdentity
gösterir.
Bu konuda,
Öğreticinin bu adımında, WriteLine
iş akışındaki etkinlikler ek bilgi sağlayacak şekilde değiştirilir ve yeni WriteLine
bir etkinlik eklenir. Özgün iş akışı derlemesinin bir kopyası depolanır ve konak uygulaması hem özgün hem de güncelleştirilmiş iş akışlarını aynı anda çalıştırabilecek şekilde güncelleştirilir.
NumberGuessWorkflowActivities projesinin kopyasını oluşturmak için
WorkflowVersionMap'i önceki iş akışı sürümlerini içerecek şekilde güncelleştirmek için
Not
Bu konudaki adımları izlemeden önce uygulamayı çalıştırın, her türden birkaç iş akışı başlatın ve her biri için bir veya iki tahminde bulunun. Bu kalıcı iş akışları bu adımda ve aşağıdaki adım olan Nasıl yapılır: Çalışan İş Akışı Örneğinin Tanımını Güncelleştirme adımında kullanılır.
NumberGuessWorkflowActivities projesinin kopyasını oluşturmak için
Açık değilse Visual Studio 2012'de WF45GettingStartedTutorial çözümünü açın.
Çözümü derlemek için CTRL+SHIFT+B'ye basın.
WF45GettingStartedTutorial çözümünü kapatın.
Windows Gezgini'ni açın ve öğretici çözüm dosyasının ve proje klasörlerinin bulunduğu klasöre gidin.
NumberGuessWorkflowHost ve NumberGuessWorkflowActivities ile aynı klasörde PreviousVersions adlı yeni bir klasör oluşturun. Bu klasör, sonraki öğretici adımlarında kullanılan iş akışlarının farklı sürümlerini içeren derlemeleri içermek için kullanılır.
NumberGuessWorkflowActivities\bin\debug klasörüne gidin (veya proje ayarlarınıza bağlı olarak bin\release). NumberGuessWorkflowActivities.dll kopyalayın ve PreviousVersions klasörüne yapıştırın.
PreviousVersions klasöründeki NumberGuessWorkflowActivities.dll NumberGuessWorkflowActivities_v1.dll olarak yeniden adlandırın.
Not
Bu konudaki adımlar, iş akışlarının birden çok sürümünü içermek için kullanılan derlemeleri yönetmenin bir yolunu gösterir. Derlemeleri güçlü adlandırma ve bunları genel derleme önbelleğine kaydetme gibi diğer yöntemler de kullanılabilir.
NumberGuessWorkflowHost, NumberGuessWorkflowActivities ve yeni eklenen PreviousVersions klasörüyle aynı klasörde NumberGuessWorkflowActivities_du adlı yeni bir klasör oluşturun ve NumberGuessWorkflowActivities klasöründeki tüm dosyaları ve alt klasörleri yeni NumberGuessWorkflowActivities_du klasörüne kopyalayın. Etkinliklerin ilk sürümü için projenin bu yedek kopyası Nasıl yapılır: Çalışan İş Akışı Örneğinin Tanımını Güncelleştirme bölümünde kullanılır.
Visual Studio 2012'de WF45GettingStartedTutorial çözümünü yeniden açın.
İş akışlarını güncelleştirmek için
Bu bölümde iş akışı tanımları güncelleştirilir. Kullanıcının tahmini hakkında geri bildirimde bulunan iki WriteLine
etkinlik güncelleştirilir ve sayı tahmin edildikten sonra oyun hakkında ek bilgi sağlayan yeni WriteLine
bir etkinlik eklenir.
StateMachine iş akışını güncelleştirmek için
Çözüm Gezgini,NumberGuessWorkflowActivities projesinin altında StateMachineNumberGuessWorkflow.xaml öğesine çift tıklayın.
Durum makinesinde Yanlış Tahmin Et geçişini çift tıklatın.
Etkinlikte
Text
enWriteLine
solun değerini güncelleştirinIf
.Guess & " is too low."
Guess + " is too low."
Etkinlikte
Text
enWriteLine
doğru olanın değerini güncelleştirinIf
.Guess & " is too high."
Guess + " is too high."
İş akışı tasarımcısının üst kısmındaki içerik haritası görünümünde StateMachine'e tıklayarak iş akışı tasarımcısında genel durum makine görünümüne dönün.
Durum makinesinde Doğru Tahmin Geçişi'ne çift tıklayın.
Bir WriteLine etkinliğini Araç Kutusu'nun Temel Öğeler bölümünden sürükleyin ve geçişin Buradaki Bırakma Eylemi etkinliği etiketine bırakın.
Özellik kutusuna aşağıdaki ifadeyi
Text
yazın.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Akış Çizelgesi iş akışını güncelleştirmek için
Çözüm Gezgini,NumberGuessWorkflowActivities projesinin altında FlowchartNumberGuessWorkflow.xaml öğesine çift tıklayın.
Text
EnWriteLine
soldaki etkinliği güncelleştirin.Guess & " is too low."
Guess + " is too low."
Text
EnWriteLine
doğru etkinliği güncelleştirin.Guess & " is too high."
Guess + " is too high."
Bir WriteLine etkinliğini Araç Kutusu'nun Temel Öğeler bölümünden sürükleyin ve en
FlowDecision
üstteki eyleminTrue
bırakma noktasına bırakın. EtkinlikWriteLine
akış çizelgesine eklenir ve eylemineFlowDecision
bağlanırTrue
.Özellik kutusuna aşağıdaki ifadeyi
Text
yazın.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Sıralı iş akışını güncelleştirmek için
Çözüm Gezgini,NumberGuessWorkflowActivities projesinin altında SequentialNumberGuessWorkflow.xaml öğesine çift tıklayın.
Etkinlikte
Text
enWriteLine
solun değerini güncelleştirinIf
.Guess & " is too low."
Guess + " is too low."
Etkinlikteki
Text
enWriteLine
doğru etkinliği güncelleştirinIf
.Guess & " is too high."
Guess + " is too high."
Bir WriteLine etkinliğini Araç Kutusu'nun Temel Öğeler bölümünden sürükleyin ve DoWhile etkinliğinden sonra bırakın, böylece WriteLine kök
Sequence
etkinliğindeki son etkinlik olur.Özellik kutusuna aşağıdaki ifadeyi
Text
yazın.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
WorkflowVersionMap'i önceki iş akışı sürümlerini içerecek şekilde güncelleştirmek için
NumberGuessWorkflowHost projesinin altındaki WorkflowVersionMap.cs (veya WorkflowVersionMap.vb) çift tıklayarak açın.
Aşağıdaki
using
(veya ) deyimlerini diğerusing
(veyaImports
Imports
) deyimleriyle dosyanın en üstüne ekleyin.Imports System.Reflection Imports System.IO
using System.Reflection; using System.IO;
Mevcut üç iş akışı kimliği bildiriminin hemen altına üç yeni iş akışı kimliği ekleyin. Bu yeni
v1
iş akışı kimlikleri, güncelleştirmeler yapılmadan önce başlatılan iş akışları için doğru iş akışı tanımını sağlar.'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;
Oluşturucuda
WorkflowVersionMap
, üç geçerli iş akışı kimliğinin özelliğini olarak2.0.0.0
güncelleştirinVersion
.'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());
içindeki iş akışlarının geçerli sürümlerini sözlüğe ekleyen kod, projede başvuruda bulunılan geçerli sürümleri kullanır, bu nedenle iş akışı tanımlarını başlatan kodun güncelleştirilmesi gerekmez.
Oluşturucuya, geçerli sürümleri sözlüğe ekleyen kodun hemen arkasına aşağıdaki kodu ekleyin.
'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) };
Bu iş akışı kimlikleri, ilgili iş akışı tanımlarının ilk sürümleriyle ilişkilendirilir.
Ardından, iş akışı tanımlarının ilk sürümünü içeren derlemeyi yükleyin ve ilgili iş akışı tanımlarını oluşturup sözlüğe ekleyin.
'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);
Aşağıdaki örnek, güncelleştirilmiş
WorkflowVersionMap
sınıfın tam listesidir.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(); } }
Uygulamayı derlemek ve çalıştırmak için
Uygulamayı oluşturmak için CTRL+SHIFT+B tuşlarına basın ve ardından başlamak için CTRL+F5 tuşlarına basın.
Yeni Oyun'a tıklayarak yeni bir iş akışı başlatın. İş akışının sürümü durum penceresinin altında görüntülenir ve ilişkili
WorkflowIdentity
sürümünden güncelleştirilmiş sürümü yansıtır. tamamlandığında iş akışınınInstanceId
izleme dosyasını görüntüleyebilmeniz için değerini not edin ve ardından oyun tamamlanana kadar tahminler girin. Etkinlik güncelleştirmelerine bağlı olarak durum penceresinde görüntülenen bilgilerde kullanıcının tahmininin nasıl görüntülendiğineWriteLine
dikkat edin.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.
Not
Etkinliklerden
WriteLine
güncelleştirilmiş metin görüntülenir, ancak bu konuya eklenen sonWriteLine
etkinliğin çıkışı görüntülenmez. Bunun nedeni durum penceresinin işleyici tarafından güncelleştirilmişPersistableIdle
olmasıdır. İş akışı tamamlandığından ve son etkinlik sonrasında boşta kalmadığından işleyiciPersistableIdle
çağrılmaz. Ancak, durum penceresinde işleyici tarafındanCompleted
benzer bir ileti görüntülenir. İsterseniz, içindeki metniStringWriter
ayıklamakCompleted
ve durum penceresinde görüntülemek için işleyiciye kod eklenebilir.Windows Gezgini'ni açın ve NumberGuessWorkflowHost\bin\debug klasörüne (veya proje ayarlarınıza bağlı olarak bin\release) gidin ve tamamlanan iş akışına karşılık gelen Not Defteri kullanarak izleme dosyasını açın. not
InstanceId
almadıysanız, Windows Gezgini'ndeki Değiştirme tarihi bilgilerini kullanarak doğru izleme dosyasını tanımlayabilirsiniz.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.
Güncelleştirilmiş
WriteLine
çıkış, bu konuda eklenen çıkışıWriteLine
da dahil olmak üzere izleme dosyasının içinde yer alır.Sayı tahmin uygulamasına geri dönün ve güncelleştirmeler yapılmadan önce başlatılan iş akışlarından birini seçin. Durum penceresinin altında görüntülenen sürüm bilgilerine bakarak seçili durumdaki iş akışının sürümünü tanımlayabilirsiniz. Bazı tahminler girin ve durum güncelleştirmelerinin önceki sürümdeki etkinlik çıkışıyla eşleştiğine
WriteLine
ve kullanıcının tahminini içermediğini unutmayın. Bunun nedeni, bu iş akışlarının güncelleştirmeleri olmayan önceki iş akışı tanımını kullanmalarıdırWriteLine
.Bir sonraki adımda, Nasıl yapılır: Çalışan İş Akışı Örneğinin Tanımını Güncelleştirme, çalışan
v1
iş akışı örnekleri, örnekler olarak yeni işlevselliği içerecek şekildev2
güncelleştirilir.