命令型コードに基づく検証
命令型コードに基づく検証は、アクティビティでアクティビティ自身に関する検証を可能にする簡単な方法を提供し、CodeActivity、AsyncCodeActivity、および NativeActivity から派生するアクティビティで使用できます。 検証のエラーまたは警告を判断する検証コードがアクティビティに追加されます。
コードに基づく検証の使用
コードに基づく検証は、CodeActivity、AsyncCodeActivity、および NativeActivity から派生するアクティビティでサポートされています。 検証コードは CacheMetadata オーバーライドに配置できます。また、検証エラーまたは警告はメタデータ引数に追加できます。 次の例では、Cost
が Price
よりも高い場合、検証エラーがメタデータに追加されます。
Note
Cost
と Price
はこのアクティビティの引数ではありませんが、デザイン時に設定されるプロパティです。 その理由は、これらの値は CacheMetadata オーバーライドで検証できるためです。 引数に流入するデータの値は、データが実行時まで流れないのでデザイン時には検証できません。しかし、RequiredArgument
属性とオーバーロード グループを使用してアクティビティの引数を検証すると、それらの引数にバインドされていることが確認できます。 このコード例では、RequiredArgument
引数の Description
属性を確認します。これがバインドされていなければ、検証エラーが生成されます。 必須の引数については、「必須の引数とオーバーロード グループ」で説明しています。
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.
}
}
既定では、検証エラーがメタデータに追加されるのは、AddValidationError が呼び出されたときです。 検証の警告を追加するには、AddValidationError を受け取る ValidationError オーバーロードを使用し、ValidationError プロパティを設定することで IsWarning が警告を表すことを示します。
検証が発生するのは、ワークフローがワークフロー デザイナーで修正され、検証エラーまたは警告がワークフロー デザイナーに表示されたときです。 ワーク フローの呼び出し時に検証も行われます。検証エラーが発生すると、既定の検証ロジックによって InvalidWorkflowException がスローされます。 検証の呼び出しと検証の警告やエラーへのアクセスの詳細については、「アクティビティ検証の呼び出し」を参照してください。
CacheMetadata からスローされる例外は、検証エラーとして処理されません。 これらの例外は、Validate への呼び出しからエスケープされ、呼び出し元によって処理される必要があります。
コードに基づく検証は、コードを含み、ワークフロー内の他のアクティビティから表示できないアクティビティを検証するときに役立ちます。 宣言の制約の検証には、ワークフロー内のアクティビティと他のアクティビティとの関係を検証する機能が備わっています。これについては、「宣言の制約」トピックを参照してください。
.NET