Menggunakan WorkflowIdentity dan Penerapan Versi

WorkflowIdentity menyediakan cara bagi pengembang aplikasi alur kerja untuk mengaitkan nama dan Version dengan definisi alur kerja, dan agar informasi ini dikaitkan dengan instans 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. Topik ini menyediakan gambaran umum penggunaan WorkflowIdentity dengan hosting WorkflowApplication. Untuk informasi tentang eksekusi definisi alur kerja secara berdampingan dalam layanan alur kerja, lihat Penerapan Versi Berdampingan di WorkflowServiceHost. Untuk informasi tentang pembaruan dinamis, lihat Pembaruan Dinamis.

Dalam topik ini

Menggunakan WorkflowIdentity

Untuk menggunakan WorkflowIdentity, buat instans, konfigurasikan, dan kaitkan dengan instans WorkflowApplication. Instans WorkflowIdentity berisi tiga bagian informasi yang mengidentifikasi. Name dan Version berisi nama dan Version serta diperlukan, dan Package bersifat opsional serta dapat digunakan untuk menentukan string tambahan yang berisi informasi seperti nama rakitan atau informasi lain yang diinginkan. WorkflowIdentity bersifat unik jika salah satu dari tiga propertinya berbeda dari properti WorkflowIdentity lain.

Penting

WorkflowIdentity tidak boleh berisi informasi pengidentifikasi pribadi (PII). Informasi tentang WorkflowIdentity yang digunakan untuk membuat instans dipancarkan ke layanan pelacakan yang dikonfigurasi di beberapa titik siklus hidup aktivitas yang berbeda oleh runtime bahasa umum. Pelacakan WF tidak memiliki mekanisme untuk menyembunyikan PII (data pengguna sensitif). Oleh karena itu, instans WorkflowIdentity tidak boleh berisi data PII apa pun karena akan dipancarkan oleh runtime bahasa umum dalam melacak rekaman dan dapat dilihat oleh siapa pun yang memiliki akses untuk melihat rekaman pelacakan.

Dalam contoh berikut, WorkflowIdentity dibuat dan dikaitkan dengan contoh alur kerja yang dibuat menggunakan definisi alur kerja MortgageWorkflow.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

Saat memuat ulang dan melanjutkan alur kerja, WorkflowIdentity yang dikonfigurasi agar sesuai WorkflowIdentity dari instans alur kerja yang bertahan harus digunakan.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the workflow.
wfApp.Load(instanceId);

// Resume the workflow...

Jika WorkflowIdentity digunakan saat memuat ulang instans alur kerja tidak cocok dengan WorkflowIdentity yang dipertahankan, VersionMismatchException akan dilemparkan. Dalam contoh berikut, upaya pemuatan dilakukan pada instans MortgageWorkflow yang dipertahankan dalam contoh sebelumnya. Upaya pemuatan ini dilakukan menggunakan WorkflowIdentity yang dikonfigurasi untuk versi alur kerja hipotek yang lebih baru yang tidak cocok dengan instans yang bertahan.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow_v2(), identityV2);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Attempt to load the workflow instance.
wfApp.Load(instanceId);

// Resume the workflow...

Ketika kode sebelumnya dijalankan, VersionMismatchException berikut ini dilemparkan.

The WorkflowIdentity ('MortgageWorkflow v1; Version=1.0.0.0') of the loaded instance does not match the WorkflowIdentity ('MortgageWorkflow v2; Version=2.0.0.0') of the provided workflow definition. The instance can be loaded using a different definition, or updated using Dynamic Update.

Eksekusi Berdampingan menggunakan WorkflowIdentity

WorkflowIdentity dapat digunakan untuk memfasilitasi eksekusi beberapa versi alur kerja secara berdampingan. Salah satu skenario umum adalah mengubah persyaratan bisnis pada alur kerja yang berjalan lama. Banyak instans alur kerja dapat berjalan saat versi yang diperbarui disebarkan. Aplikasi host dapat dikonfigurasi untuk menggunakan definisi alur kerja yang diperbarui saat memulai instans baru, dan merupakan tanggung jawab aplikasi host untuk memberikan definisi alur kerja yang benar saat melanjutkan instans. WorkflowIdentity dapat digunakan untuk mengidentifikasi dan menyediakan definisi alur kerja yang cocok saat melanjutkan instans alur kerja.

Untuk mengambil instans alur kerja WorkflowIdentity yang bertahan, metode GetInstance ini digunakan. Metode ini GetInstance mengambil instans alur kerja Id yang bertahan dan SqlWorkflowInstanceStore yang berisi instans yang bertahan dan mengembalikan WorkflowApplicationInstance. WorkflowApplicationInstance berisi informasi tentang instans alur kerja yang bertahan, termasuk WorkflowIdentity yang terkait. WorkflowIdentity yang terkait ini dapat digunakan oleh host untuk menyediakan definisi alur kerja yang benar saat memuat dan melanjutkan instans alur kerja.

Catatan

Null WorkflowIdentity bersifat valid, dan dapat digunakan oleh host untuk memetakan instans yang dipertahankan tanpa WorkflowIdentity yang terkait dengan definisi alur kerja yang tepat. Skenario ini dapat terjadi ketika aplikasi alur kerja awalnya tidak ditulis dengan penerapan versi alur kerja, atau ketika aplikasi ditingkatkan dari .NET Framework 4. Untuk informasi selengkapnya, lihat Meningkatkan Database Persistensi .NET Framework 4 untuk Mendukung Penerapan Versi Alur Kerja.

Dalam contoh Dictionary<WorkflowIdentity, Activity> berikut digunakan untuk mengaitkan instans WorkflowIdentitydengan definisi alur kerja yang cocok, dan alur kerja dimulai menggunakan definisi alur kerja MortgageWorkflow, yang terkait denganidentityV1WorkflowIdentity.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowIdentity identityV2 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v2",
    Version = new Version(2, 0, 0, 0)
};

Dictionary<WorkflowIdentity, Activity> WorkflowVersionMap = new Dictionary<WorkflowIdentity, Activity>();
WorkflowVersionMap.Add(identityV1, new MortgageWorkflow());
WorkflowVersionMap.Add(identityV2, new MortgageWorkflow_v2());

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

Dalam contoh berikut, informasi tentang instans alur kerja yang bertahan dari contoh sebelumnya diambil dengan memanggil GetInstance, dan informasi WorkflowIdentity yang bertahan digunakan untuk mengambil definisi alur kerja yang cocok. Informasi ini digunakan untuk mengonfigurasi WorkflowApplication, lalu alur kerja dimuat. Perhatikan bahwa karena overload Load yang mengambil WorkflowApplicationInstance digunakan, SqlWorkflowInstanceStore yang dikonfigurasi pada WorkflowApplicationInstance digunakan oleh WorkflowApplication dan oleh karena itu properti InstanceStore-nya tidak perlu dikonfigurasi.

Catatan

Jika properti InstanceStore diatur, properti harus diatur dengan instans SqlWorkflowInstanceStore yang sama yang digunakan oleh WorkflowApplicationInstance atau jika tidak, ArgumentException akan dilemparkan dengan pesan berikut: The instance is configured with a different InstanceStore than this WorkflowApplication..

// Get the WorkflowApplicationInstance of the desired workflow from the specified
// SqlWorkflowInstanceStore.
WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(instanceId, store);

// Use the persisted WorkflowIdentity to retrieve the correct workflow
// definition from the dictionary.
Activity definition = WorkflowVersionMap[instance.DefinitionIdentity];

WorkflowApplication wfApp = new WorkflowApplication(definition, instance.DefinitionIdentity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(instance);

// Resume the workflow...

Meningkatkan Database Persistensi .NET Framework 4 untuk Mendukung Penerapan Versi Alur Kerja

Skrip database SqlWorkflowInstansStoreSchemaUpgrade.sql disediakan untuk meningkatkan database persistensi yang dibuat menggunakan skrip database .NET Framework 4. Skrip ini memperbarui database untuk mendukung kemampuan penerapan versi baru yang diperkenalkan di .NET Framework 4.5. Setiap instans alur kerja yang bertahan dalam database diberi nilai penerapan versi default, dan kemudian dapat berpartisipasi dalam eksekusi berdampingan dan pembaruan dinamis.

Jika aplikasi alur kerja .NET Framework 4.5 mencoba operasi persistensi apa pun yang menggunakan fitur penerapan versi baru pada database persistensi yang belum ditingkatkan menggunakan skrip yang disediakan, InstancePersistenceCommandException akan dilemparkan dengan pesan yang mirip dengan pesan berikut.

The SqlWorkflowInstanceStore has a database version of '4.0.0.0'. InstancePersistenceCommand 'System.Activities.DurableInstancing.CreateWorkflowOwnerWithIdentityCommand' cannot be run against this database version.  Please upgrade the database to '4.5.0.0'.

Untuk meningkatkan skema database

  1. Buka SQL Server Management Studio dan sambungkan ke server database persistensi, misalnya .\SQLEXPRESS.

  2. Pilih Buka, File dari menu File. Telusuri ke folder berikut: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. Pilih SqlWorkflowInstanceStoreSchemaUpgrade.sql dan klik Buka.

  4. Pilih nama database persistensi di menu drop-down Database yang Tersedia.

  5. Pilih Jalankan dari menu Kueri.

Saat kueri selesai, skema database ditingkatkan, dan jika diinginkan, Anda bisa menampilkan identitas alur kerja default yang ditetapkan ke instans alur kerja yang bertahan. Perluas database persistensi Anda di node DatabaseObject Explorer, lalu perluas node Tampilan. Klik kanan System.Activities.DurableInstancing.Instances dan pilih Pilih 1000 Baris Teratas. Gulir ke akhir kolom dan perhatikan bahwa ada enam kolom tambahan yang ditambahkan ke tampilan: IdentityName, IdentityPackage, Build, Major, Minor, dan Revisi. Setiap alur kerja yang bertahan akan memiliki nilai NULL untuk bidang ini, mewakili identitas alur kerja null.