Cara: Menghosting Beberapa Versi Alur Kerja Secara Berdampingan
WorkflowIdentity
menyediakan cara bagi pengembang aplikasi alur kerja untuk mengaitkan nama dan versi dengan definisi alur kerja, dan agar informasi ini dikaitkan dengan contoh alur kerja yang bertahan. Informasi identitas ini dapat digunakan oleh pengembang aplikasi alur kerja untuk mengaktifkan skenario seperti eksekusi berdampingan dari beberapa versi definisi alur kerja, dan menyediakan landasan untuk fungsionalitas lain seperti pembaruan dinamis. Langkah dalam tutorial ini menunjukkan cara menggunakan WorkflowIdentity
untuk menghosting beberapa versi alur kerja secara bersamaan.
Dalam topik ini
Dalam langkah tutorial ini, aktivitas WriteLine
dalam alur kerja dimodifikasi untuk memberikan informasi tambahan, dan aktivitas WriteLine
baru ditambahkan. Salinan rakitan alur kerja asli disimpan, dan aplikasi host diperbarui sehingga dapat menjalankan alur kerja asli dan yang diperbarui secara bersamaan.
Catatan
Sebelum mengikuti langkah-langkah dalam topik ini, jalankan aplikasi, mulai beberapa alur kerja dari setiap jenis, dan buat satu atau dua tebakan untuk masing-masing. Alur kerja yang dipertahankan ini digunakan dalam langkah ini dan langkah berikut, Cara: Memperbarui Definisi Instans Alur Kerja yang Berjalan.
Untuk membuat salinan proyek NumberGuessWorkflowActivities
Buka solusi WF45GettingStartedTutorial di Visual Studio 2012 jika tidak terbuka.
Tekan CTRL+SHIFT+B untuk membangun solusi.
Tutup solusi WF45GettingStartedTutorial.
Buka Windows Explorer dan buka folder tempat file solusi tutorial dan folder proyek berada.
Buat folder baru bernama PreviousVersions di folder yang sama dengan NumberGuessWorkflowHost dan NumberGuessWorkflowActivities. Folder ini digunakan untuk menampung rakitan yang berisi berbagai versi alur kerja yang digunakan dalam langkah-langkah tutorial berikutnya.
Buka folder NumberGuessWorkflowActivities\bin\debug (atau bin\release bergantung pada pengaturan proyek Anda). Salin NumberGuessWorkflowActivities.dll dan tempelkan ke folder PreviousVersions.
Ganti nama NumberGuessWorkflowActivities.dll di folder PreviousVersions menjadi NumberGuessWorkflowActivities_v1.dll.
Catatan
Langkah-langkah dalam topik ini menunjukkan salah satu cara untuk mengelola rakitan yang digunakan untuk berisi beberapa versi alur kerja. Metode lain seperti penamaan yang kuat rakitan dan mendaftarkannya di singgahan perakitan global juga dapat digunakan.
Buat folder baru bernama NumberGuessWorkflowActivities_du di folder yang sama dengan NumberGuessWorkflowHost, NumberGuessWorkflowActivities, dan folder PreviousVersions yang baru ditambahkan, dan salin semua file dan subfolder dari folder NumberGuessWorkflowActivities ke folder NumberGuessWorkflowActivities_du baru. Salinan cadangan proyek untuk versi awal aktivitas ini digunakan dalam Cara: Memperbarui Definisi Instans Alur Kerja yang Berjalan.
Buka kembali solusi WF45GettingStartedTutorial di Visual Studio 2012.
Untuk memperbarui alur kerja
Di bagian ini, definisi alur kerja diperbarui. Dua aktivitas WriteLine
yang memberikan umpan balik tentang tebakan pengguna diperbarui, dan aktivitas WriteLine
baru ditambahkan yang memberikan informasi tambahan tentang permainan setelah jumlahnya ditebak.
Untuk memperbarui alur kerja StateMachine
Di Penjelajah Solusi, pada proyek NumberGuessWorkflowActivities, klik dua kali StateMachineNumberGuessWorkflow.xaml.
Klik dua kali transisi Tebak Salah pada mesin status.
Perbarui
Text
dariWriteLine
di sebelah paling kiri dalam aktivitasIf
.Guess & " is too low."
Guess + " is too low."
Perbarui
Text
dariWriteLine
di sebelah paling kanan dalam aktivitasIf
.Guess & " is too high."
Guess + " is too high."
Kembali ke tampilan mesin status keseluruhan di perancang alur kerja dengan mengklik StateMachine di tampilan breadcrumb di bagian atas perancang alur kerja.
Klik dua kali transisi Tebak Benar pada mesin status.
Seret aktivitas WriteLine dari bagian Primitives di Toolbox dan letakkan di label Aktivitas Drop Action di sini pada transisi.
Ketik ekspresi berikut ke dalam kotak properti
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Untuk memperbarui alur kerja Diagram alur
Di Penjelajah Solusi, pada proyek NumberGuessWorkflowActivities, klik dua kali FlowchartNumberGuessWorkflow.xaml.
Perbarui
Text
dari aktivitasWriteLine
paling kiri.Guess & " is too low."
Guess + " is too low."
Perbarui
Text
dari aktivitasWriteLine
paling kanan.Guess & " is too high."
Guess + " is too high."
Seret aktivitas WriteLine dari bagian Primitives di Toolbox dan letakkan di titik lepas tindakan
True
diFlowDecision
paling atas. AktivitasWriteLine
ditambahkan ke diagram alur dan ditautkan ke tindakanTrue
dariFlowDecision
.Ketik ekspresi berikut ke dalam kotak properti
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Untuk memperbarui alur kerja Berurutan
Di Penjelajah Solusi, pada proyek NumberGuessWorkflowActivities, klik dua kali SequentialNumberGuessWorkflow.xaml.
Perbarui
Text
dariWriteLine
di sebelah paling kiri dalam aktivitasIf
.Guess & " is too low."
Guess + " is too low."
Perbarui
Text
dari aktivitasWriteLine
paling kanan di aktivitasIf
.Guess & " is too high."
Guess + " is too high."
Seret aktivitas WriteLine dari bagian Primitives di Toolbox dan lepaskan setelah aktivitas DoWhile sehingga WriteLine adalah aktivitas terakhir dalam aktivitas root
Sequence
.Ketik ekspresi berikut ke dalam kotak properti
Text
.Guess & " is correct. You guessed it in " & Turns & " turns."
Guess + " is correct. You guessed it in " + Turns + " turns."
Untuk memperbarui WorkflowVersionMap guna menyertakan versi alur kerja sebelumnya
Klik dua kali WorkflowVersionMap.cs (atau WorkflowVersionMap.vb) pada proyek NumberGuessWorkflowHost untuk membukanya.
Tambahkan pernyataan
using
(atauImports
) berikut ke bagian atas file dengan pernyataanusing
(atauImports
) lainnya.Imports System.Reflection Imports System.IO
using System.Reflection; using System.IO;
Tambahkan tiga identitas alur kerja baru tepat di bawah tiga deklarasi identitas alur kerja yang ada. Identitas alur kerja
v1
baru ini akan digunakan untuk memberikan definisi alur kerja yang benar untuk alur kerja yang dimulai sebelum pembaruan dibuat.'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;
Di konstruktor
WorkflowVersionMap
, perbarui propertiVersion
dari tiga identitas alur kerja saat ini ke2.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());
Kode di dalamnya menambahkan versi alur kerja saat ini ke kamus menggunakan versi saat ini yang direferensikan dalam proyek. Dengan begitu, kode yang menginisialisasi definisi alur kerja tidak perlu diperbarui.
Tambahkan kode berikut di konstruktor tepat setelah kode yang menambahkan versi saat ini ke kamus.
'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) };
Identitas alur kerja ini dikaitkan dengan versi awal dari definisi alur kerja yang sesuai.
Selanjutnya, muat rakitan yang berisi versi awal definisi alur kerja, dan buat serta tambahkan definisi alur kerja yang sesuai ke kamus.
'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);
Contoh berikut adalah daftar lengkap untuk kelas
WorkflowVersionMap
yang diperbarui.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(); } }
Untuk membangun dan menjalankan aplikasi
Tekan CTRL+SHIFT+B untuk membangun aplikasi, lalu CTRL+F5 untuk memulai.
Mulai alur kerja baru dengan mengklik Permainan Baru. Versi alur kerja ditampilkan di bawah jendela status dan mencerminkan versi yang diperbarui dari
WorkflowIdentity
yang terkait. CatatInstanceId
sehingga Anda dapat melihat file penelusuran untuk alur kerja setelah selesai, lalu masukkan tebakan hingga permainan selesai. Perhatikan bagaimana tebakan pengguna ditampilkan dalam informasi yang ditampilkan di jendela status berdasarkan pembaruan aktivitasWriteLine
.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.
Catatan
Teks yang diperbarui dari aktivitas
WriteLine
akan ditampilkan, tetapi tidak untuk keluaran aktivitasWriteLine
akhir yang ditambahkan dalam topik ini. Hal tersebut terjadi karena jendela status diperbarui oleh handlerPersistableIdle
. Karena alur kerja selesai dan tidak menganggur setelah aktivitas akhir, penanganPersistableIdle
tidak dipanggil. Namun, pesan serupa ditampilkan di jendela status oleh penanganCompleted
. Jika diinginkan, kode dapat ditambahkan ke penanganCompleted
untuk mengekstrak teks dariStringWriter
dan menampilkannya ke jendela status.Buka Windows Explorer dan navigasi ke folder NumberGuessWorkflowHost\bin\debug (atau bin\release tergantung pada pengaturan proyek Anda) dan buka file penelusuran menggunakan Notepad yang sesuai dengan alur kerja yang telah selesai. Jika Anda tidak mencatat
InstanceId
, Anda dapat mengidentifikasi file penelusuran yang benar dengan menggunakan informasi Tanggal diubah di Windows Explorer.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.
Keluaran
WriteLine
yang diperbarui terkandung dalam file penelusuran, termasuk keluaranWriteLine
yang ditambahkan dalam topik ini.Beralih kembali ke aplikasi penebakan angka dan pilih salah satu alur kerja yang dimulai sebelum pembaruan dilakukan. Anda dapat mengidentifikasi versi alur kerja yang saat ini dipilih dengan melihat informasi versi yang ditampilkan di bawah jendela status. Masukkan beberapa tebakan dan perhatikan bahwa pembaruan status cocok dengan keluaran aktivitas
WriteLine
dari versi sebelumnya, dan jangan sertakan tebakan pengguna. Hal tersebut karena alur kerja ini menggunakan definisi alur kerja sebelumnya yang tidak memiliki pembaruanWriteLine
.Pada langkah berikutnya, Cara: Memperbarui Definisi Instans Alur Kerja yang Berjalan, instans alur kerja
v1
yang berjalan diperbarui sehingga berisi fungsionalitas baru sebagai instansv2
.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk