Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Validasi aktivitas menyediakan metode untuk mengidentifikasi dan melaporkan kesalahan dalam konfigurasi aktivitas apa pun sebelum eksekusinya. Validasi terjadi ketika alur kerja dimodifikasi di perancang alur kerja dan kesalahan validasi atau peringatan ditampilkan di perancang alur kerja. Validasi juga terjadi pada runtime ketika alur kerja dipanggil dan jika ada kesalahan validasi yang terjadi, dilemparkan InvalidWorkflowException oleh logika validasi default. Windows Workflow Foundation (WF) menyediakan ActivityValidationServices kelas yang dapat digunakan oleh aplikasi alur kerja dan pengembang alat untuk memvalidasi aktivitas secara eksplisit. Topik ini menjelaskan cara menggunakan ActivityValidationServices untuk melakukan validasi aktivitas.
Menggunakan LayananValidasiAktivitas
ActivityValidationServices memiliki dua Validate kelebihan beban yang digunakan untuk memanggil logika validasi aktivitas. Overload pertama mengambil aktivitas root yang akan divalidasi dan mengembalikan kumpulan kesalahan dan peringatan validasi. Dalam contoh berikut, aktivitas kustom Add digunakan yang memiliki dua argumen yang diperlukan.
public sealed class Add : CodeActivity<int>
{
[RequiredArgument]
public InArgument<int> Operand1 { get; set; }
[RequiredArgument]
public InArgument<int> Operand2 { get; set; }
protected override int Execute(CodeActivityContext context)
{
return Operand1.Get(context) + Operand2.Get(context);
}
}
Aktivitas Add digunakan di dalam Sequence, tetapi dua argumen yang diperlukan tidak terikat, seperti yang ditunjukkan dalam contoh berikut.
Variable<int> Operand1 = new Variable<int>{ Default = 10 };
Variable<int> Operand2 = new Variable<int>{ Default = 15 };
Variable<int> Result = new Variable<int>();
Activity wf = new Sequence
{
Variables = { Operand1, Operand2, Result },
Activities =
{
new Add(),
new WriteLine
{
Text = new InArgument<string>(env => "The result is " + Result.Get(env))
}
}
};
Alur kerja ini dapat divalidasi dengan memanggil Validate. Validate mengembalikan kumpulan kesalahan validasi atau peringatan yang terkandung dalam aktivitas dan anak-anaknya, seperti yang ditunjukkan dalam contoh berikut ini.
ValidationResults results = ActivityValidationServices.Validate(wf);
if (results.Errors.Count == 0 && results.Warnings.Count == 0)
{
Console.WriteLine("No warnings or errors");
}
else
{
foreach (ValidationError error in results.Errors)
{
Console.WriteLine("Error: {0}", error.Message);
}
foreach (ValidationError warning in results.Warnings)
{
Console.WriteLine("Warning: {0}", warning.Message);
}
}
Ketika Validate dipanggil pada alur kerja sampel ini, dua kesalahan validasi dikembalikan.
Kesalahan: Nilai untuk argumen aktivitas yang diperlukan 'Operand2' tidak disediakan.Kesalahan: Nilai untuk argumen aktivitas yang diperlukan 'Operand1' tidak disediakan. Jika alur kerja ini dipanggil, alur kerja akan dilemparkan, seperti yang InvalidWorkflowException ditunjukkan dalam contoh berikut.
try
{
WorkflowInvoker.Invoke(wf);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
System.Activities.InvalidWorkflowException:Kesalahan berikut ditemui saat memproses pohon alur kerja:'Tambahkan': Nilai untuk argumen aktivitas yang diperlukan 'Operand2' tidak disediakan.'Tambahkan': Nilai untuk argumen aktivitas yang diperlukan 'Operand1' tidak disediakan. Agar contoh alur kerja ini valid, dua argumen aktivitas yang Add diperlukan harus terikat. Dalam contoh berikut, dua argumen yang diperlukan terikat ke variabel alur kerja bersama dengan nilai hasil. Dalam contoh berikut, argumen Result terikat bersama dengan dua argumen yang diperlukan. Argumen Result tidak diperlukan untuk terikat dan tidak menyebabkan kesalahan validasi jika tidak. Penulis alur kerja bertanggung jawab untuk mengikat Result jika nilainya digunakan di tempat lain dalam alur kerja.
new Add
{
Operand1 = Operand1,
Operand2 = Operand2,
Result = Result
}
Memvalidasi Argumen yang Diperlukan pada Aktivitas Akar
Jika aktivitas akar alur kerja memiliki argumen, ini tidak terikat hingga alur kerja dipanggil dan parameter diteruskan ke alur kerja. Alur kerja berikut melewati validasi, tetapi pengecualian dilemparkan jika alur kerja dipanggil tanpa meneruskan argumen yang diperlukan, seperti yang ditunjukkan dalam contoh berikut.
Activity wf = new Add();
ValidationResults results = ActivityValidationServices.Validate(wf);
// results has no errors or warnings, but when the workflow
// is invoked, an InvalidWorkflowException is thrown.
try
{
WorkflowInvoker.Invoke(wf);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
System.ArgumentException: Pengaturan argumen aktivitas akar salah.Perbaiki definisi alur kerja atau berikan nilai input untuk memperbaiki kesalahan ini:'Tambahkan': Nilai untuk argumen aktivitas yang diperlukan 'Operand2' tidak disediakan.'Tambahkan': Nilai untuk argumen aktivitas yang diperlukan 'Operand1' tidak disediakan. Setelah argumen yang benar diteruskan, alur kerja berhasil diselesaikan, seperti yang diperlihatkan dalam contoh berikut.
Add wf = new Add();
ValidationResults results = ActivityValidationServices.Validate(wf);
// results has no errors or warnings, and the workflow completes
// successfully because the required arguments were passed.
try
{
Dictionary<string, object> wfparams = new Dictionary<string, object>
{
{ "Operand1", 10 },
{ "Operand2", 15 }
};
int result = WorkflowInvoker.Invoke(wf, wfparams);
Console.WriteLine("Result: {0}", result);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Nota
Dalam contoh ini, aktivitas akar dinyatakan sebagai Add alih-alih Activity sebagai contoh sebelumnya. Ini memungkinkan metode WorkflowInvoker.Invoke untuk mengembalikan bilangan bulat tunggal yang mewakili hasil aktivitas Add alih-alih kamus argumen out. Variabel wf juga dapat dinyatakan sebagai Activity<int>.
Saat memvalidasi argumen akar, aplikasi host bertanggung jawab untuk memastikan bahwa semua argumen yang diperlukan diteruskan saat alur kerja dipanggil.
Memanggil Validasi Berbasis Kode Imperatif
Validasi berbasis kode imperatif menyediakan cara sederhana bagi aktivitas untuk memberikan validasi tentang dirinya sendiri, dan tersedia untuk aktivitas yang berasal dari CodeActivity, AsyncCodeActivity, dan NativeActivity. Kode validasi yang menentukan kesalahan validasi atau peringatan ditambahkan ke aktivitas. Ketika validasi dipanggil pada aktivitas, peringatan atau kesalahan ini terkandung dalam koleksi yang dikembalikan oleh panggilan ke Validate. Dalam contoh berikut, sebuah aktivitas CreateProduct ditentukan. Jika Cost lebih besar dari Price, kesalahan validasi akan ditambahkan ke metadata dalam override CacheMetadata.
public sealed class CreateProduct : CodeActivity
{
public double Price { get; set; }
public double Cost { get; set; }
// [RequiredArgument] attribute will generate a validation error
// if the Description argument is not set.
[RequiredArgument]
public InArgument<string> Description { get; set; }
protected override void CacheMetadata(CodeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
// Determine when the activity has been configured in an invalid way.
if (this.Cost > this.Price)
{
// Add a validation error with a custom message.
metadata.AddValidationError("The Cost must be less than or equal to the Price.");
}
}
protected override void Execute(CodeActivityContext context)
{
// Not needed for the sample.
}
}
Dalam contoh ini, alur kerja dikonfigurasi menggunakan aktivitas CreateProduct. Dalam alur kerja ini, Cost lebih besar dari Price, dan argumen yang diperlukan Description tidak diatur. Ketika validasi dipanggil, kesalahan berikut dikembalikan.
Activity wf = new Sequence
{
Activities =
{
new CreateProduct
{
Cost = 75.00,
Price = 55.00
// Cost > Price and required Description argument not set.
},
new WriteLine
{
Text = "Product added."
}
}
};
ValidationResults results = ActivityValidationServices.Validate(wf);
if (results.Errors.Count == 0 && results.Warnings.Count == 0)
{
Console.WriteLine("No warnings or errors");
}
else
{
foreach (ValidationError error in results.Errors)
{
Console.WriteLine("Error: {0}", error.Message);
}
foreach (ValidationError warning in results.Warnings)
{
Console.WriteLine("Warning: {0}", warning.Message);
}
}
Kesalahan: Biaya harus kurang dari atau sama dengan Harga.Kesalahan: Nilai untuk argumen aktivitas yang diperlukan 'Deskripsi' tidak disediakan.
Nota
Pengembang aktivitas kustom dapat memberikan logika validasi kustom dalam penimpaan CacheMetadata aktivitas. Pengecualian apa pun yang dilemparkan dari CacheMetadata tidak diperlakukan sebagai kesalahan validasi. Pengecualian ini akan lolos dari panggilan ke Validate dan harus ditangani oleh pemanggil.
Menggunakan ValidationSettings
Secara default, semua aktivitas di pohon aktivitas dievaluasi ketika validasi dipanggil oleh ActivityValidationServices.
ValidationSettings memungkinkan validasi disesuaikan dengan beberapa cara berbeda dengan mengonfigurasi tiga propertinya.
SingleLevel menentukan apakah validator harus berjalan di seluruh pohon aktivitas atau hanya menerapkan logika validasi ke aktivitas yang disediakan. Default untuk nilai ini adalah false.
AdditionalConstraints menentukan pemetaan batasan tambahan dari jenis ke daftar batasan. Untuk jenis dasar setiap aktivitas di pohon aktivitas yang sedang divalidasi, dilakukan pencarian dalam AdditionalConstraints. Jika daftar batasan yang cocok ditemukan, semua batasan dalam daftar dievaluasi untuk aktivitas tersebut.
OnlyUseAdditionalConstraints menentukan apakah validator harus mengevaluasi semua batasan atau hanya yang ditentukan dalam AdditionalConstraints. Nilai defaultnya adalah false.
AdditionalConstraints dan OnlyUseAdditionalConstraints berguna bagi penulis host alur kerja untuk menambahkan validasi tambahan untuk alur kerja, seperti batasan kebijakan untuk alat seperti FxCop. Untuk informasi selengkapnya tentang batasan, lihat Batasan Deklaratif.
Untuk menggunakan ValidationSettings, konfigurasikan properti yang diinginkan, lalu teruskan dalam panggilan ke Validate. Dalam contoh ini, alur kerja yang terdiri dari Sequence dengan aktivitas kustom Add divalidasi. Aktivitas Add memiliki dua argumen yang diperlukan.
public sealed class Add : CodeActivity<int>
{
[RequiredArgument]
public InArgument<int> Operand1 { get; set; }
[RequiredArgument]
public InArgument<int> Operand2 { get; set; }
protected override int Execute(CodeActivityContext context)
{
return Operand1.Get(context) + Operand2.Get(context);
}
}
Aktivitas berikut Add digunakan dalam Sequence, tetapi dua argumen yang diperlukan tidak terikat.
Variable<int> Operand1 = new Variable<int> { Default = 10 };
Variable<int> Operand2 = new Variable<int> { Default = 15 };
Variable<int> Result = new Variable<int>();
Activity wf = new Sequence
{
Variables = { Operand1, Operand2, Result },
Activities =
{
new Add(),
new WriteLine
{
Text = new InArgument<string>(env => "The result is " + Result.Get(env))
}
}
};
Untuk contoh berikut, validasi dilakukan dengan SingleLevel diatur ke true, sehingga hanya aktivitas akar Sequence yang divalidasi.
ValidationSettings settings = new ValidationSettings
{
SingleLevel = true
};
ValidationResults results = ActivityValidationServices.Validate(wf, settings);
if (results.Errors.Count == 0 && results.Warnings.Count == 0)
{
Console.WriteLine("No warnings or errors");
}
else
{
foreach (ValidationError error in results.Errors)
{
Console.WriteLine("Error: {0}", error.Message);
}
foreach (ValidationError warning in results.Warnings)
{
Console.WriteLine("Warning: {0}", warning.Message);
}
}
Kode ini menampilkan output berikut:
Tidak ada peringatan atau kesalahan Meskipun Add aktivitas memiliki argumen yang diperlukan yang tidak terikat, validasi berhasil karena hanya aktivitas akar yang dievaluasi. Jenis validasi ini berguna untuk memvalidasi hanya elemen tertentu dalam pohon aktivitas, seperti validasi perubahan properti dari satu aktivitas dalam perancang. Perhatikan bahwa jika alur kerja ini dipanggil, validasi penuh yang dikonfigurasi dalam alur kerja dievaluasi dan InvalidWorkflowException akan dilemparkan.
ActivityValidationServices dan ValidationSettings mengonfigurasi hanya validasi yang secara eksplisit dipanggil oleh host, dan bukan validasi yang terjadi ketika alur kerja dipanggil.