アクティビティ検証ロジックの概要
アクティビティの検証コンポーネントは、デザイン時と実行時の検証ロジックをすべて収容しています。これにより、アクティビティのメタデータに定義されるアクティビティのプロパティが適切に構成されます。
アクティビティのフレームワークは、既定で広範囲にわたる検証機能を提供しているので、多くの場合、アクティビティ向けにカスタム検証を作成する必要はありません。独自のカスタム検証クラスを作成する場合は、カスタム クラスが Validator クラスを継承する必要があります。
メモ : |
---|
既定では、アクティビティのインスタンス プロパティは、ValidationOptionAttribute を ValidationOption.Required に設定した場合でも検証されません。カスタム アクティビティのインスタンス プロパティを検証するには、専用のカスタム検証を作成する必要があります。 |
検証は、ワークフローのコンパイル中に自動的に行われます。また、アクティビティの検証コンポーネントの Validate メソッドが、パラメータに対応するアクティビティ メタデータ オブジェクトを指定して呼び出されたときにも、必ず実行されます。これにより、ワークフロー作成ツールは、"Correct-by-Construction" パラダイムを使用することもできます。
さらに、ワークフローへの変更が行われると、ワークフロー インスタンスの検証が実行時に発生します。この検証は、コンパイル時に実行された検証と異なる可能性があります。この機能により、実行中のワークフロー インスタンスのアクティビティ ツリーに対するアクティビティの追加や置換などの実行時の操作が安全に行われます。
ActivityValidator クラスを派生させて、Validate メソッドをオーバーライドしてカスタム検証コードを追加することによってカスタム アクティビティ バリデータを作成する方法の例を次に示します。
Public Class CustomActivityValidator
Inherits ActivityValidator
Public Overrides Function Validate(ByVal manager As ValidationManager, ByVal obj As Object) As ValidationErrorCollection
Dim activity As Activity1 = CType(obj, Activity1)
If activity.Parent IsNot Nothing Or activity.Activities.Count <> 0 Then
Dim errors As ValidationErrorCollection = New ValidationErrorCollection()
errors.AddRange(MyBase.Validate(manager, obj))
Return errors
End If
Return New ValidationErrorCollection()
End Function
End Class
public class CustomActivityValidator : ActivityValidator
{
public override ValidationErrorCollection Validate(ValidationManager manager, object obj)
{
Activity1 activity = obj as Activity1;
if (activity.Parent != null || activity.Activities.Count != 0)
{
ValidationErrorCollection errors = new ValidationErrorCollection();
errors.AddRange(base.Validate(manager, obj));
return errors;
}
return new ValidationErrorCollection();
}
}
アクティビティと共にカスタム検証を使用するには、次の例に示すように、アクティビティを ActivityValidatorAttribute で装飾する必要があります。
<ActivityValidator(GetType(CustomActivityValidator))> _
Public Class Activity1
Inherits SequenceActivity
Public Shared MyPropertyProperty As DependencyProperty = System.Workflow.ComponentModel.DependencyProperty.Register("MyProperty", GetType(String), GetType(Activity1))
<DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
Public Property MyProperty() As String
Get
Return (CType((MyBase.GetValue(Activity1.MyPropertyProperty)), String))
End Get
Set(ByVal Value As String)
MyBase.SetValue(Activity1.MyPropertyProperty, value)
End Set
End Property
End Class
[ActivityValidator(typeof(CustomActivityValidator))]
public partial class Activity1: SequenceActivity
{
public Activity1()
{
InitializeComponent();
}
public static DependencyProperty MyPropertyProperty = System.Workflow.ComponentModel.DependencyProperty.Register("MyProperty", typeof(string), typeof(Activity1));
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public string MyProperty
{
get
{
return ((string)(base.GetValue(Activity1.MyPropertyProperty)));
}
set
{
base.SetValue(Activity1.MyPropertyProperty, value);
}
}
}
関連項目
参照
概念
その他の技術情報
Copyright © 2007 by Microsoft Corporation.All rights reserved.