前回は属性による指定と CacheMetadata メソッド内部での検証ロジック実行という方法を利用しましたが、今回は制約(Constraint)による検証を行ってみます。制約とは MSDN にも記載されている通り「検証ロジックを含むアクティビティ」となっています。そのためコードだけでなく XAML によっての作成も可能です。
今回はコードによって制約を作成し、検証を行ってみます。
制約にて検証を行う場合、Constraint を返却するメソッドを検証を行うアクティビティの Constraints プロパティに追加する必要があります。
1: <ContentProperty("BODY")>
2: Public Class CommentOutActivity
3: Inherits CodeActivity
4:
5: Public Property Body As Activity
6:
7: Public Sub New()
8: Me.Constraints.Add(TestValidate)
9: End Sub
10:
11: Public Shared Function TestValidate() As Constraint
12: Dim element As New DelegateInArgument(Of CommentOutActivity)
13:
14: Dim funclambda As System.Linq.Expressions.Expression(Of Func(Of ActivityContext, Boolean)) =
15: Function(env) (element.Get(env).Body IsNot Nothing)
16:
17: Return New Constraint(Of CommentOutActivity) With {
18: .Body = New ActivityAction(Of CommentOutActivity, ValidationContext) With {
19: .Argument1 = element,
20: .Handler = New AssertValidation With {
21: .IsWarning = True,
22: .Assertion = New InArgument(Of Boolean)(funclambda),
23: .Message = New InArgument(Of String)("必要がないなら消してください……")
24: }
25: }
26: }
27:
28: End Function
29:
30: End Class
以前紹介した CommnetOut アクティビティに制約を追加してみました。実際に制約として検証する処理を TestValidate メソッドとして作成し、CommentOut アクティビティの生成時に Constraints プロパティに追加しています。
TestValidate メソッドの中では、検証時に渡されるアクティビティを element という変数で受取り、検証する内容を funclambda という変数にラムダ式で設定しています。なお Expression というクラスは他でも利用されているので、名前空間には注意してください。今回の検証内容は、CommentOut アクティビティの本体に何もアクティビティが含まれていない場合は「いらないなら消せ」というワーニングを表示する、というものです。返却している Constraint の Body プロパティに ActivityAction を設定し、その内部 Handler プロパティに制約を表す AssertValidation のインスタンスを設定しています。
今回はわざわざ funclambda という変数にラムダ式を設定し、それを AssertValidation.Assertion プロパティに設定するという事をしていますが、実際にはそのまま記述する事が殆どだと思われます。
このような形で制約を作成しアクティビティに組み込むことで検証が行われます。
0 件のコメント:
コメントを投稿