Workflow Foundation 4.0の設計時検証のパターンは何ですか?
-
22-07-2019 - |
質問
WF 4.0のカスタムアクティビティ/カスタムアクティビティファクトリ/カスタムデザイナーで検証を行う時期と方法については不明です。
検証エラーのサポートを提供していると思われるアクティビティ内の唯一の場所は、 CacheMetadata メソッド内です(これは設計プロセス中に複数回呼び出されると思います)。これは、検証を行うべき場所ですか? ActivityDesigner内で検証のサポートはありますか?
解決
はい、アクティビティのCacheMetadataは検証を行うべき場所です。検証は、デザイナーだけでなくワークフローランタイムにも適用される概念です。 (これは、検証エラーがあるコンパイル済みまたは宣言型のワークフローを実行しようとすることができるという事実からわかりますが、実行すると例外がスローされます。)
例:
protected override void CacheMetadata(ActivityMetadata metadata)
{
if (this.Body == 0) metadata.AddValidationError(
new ValidationError(
"You forgot to supply a body for (this activity)",
/*iswarning = */ true,
"Body"));
}
( ActivityMetadata.AddValidationError を参照)
2番目の質問は、ActivityDesigner側から検証を追加するためのサポートがありますか?答えは「いいえ、そうではありません」です。ActivityDesignerの上に「カスタム検証」を追加するカスタムWPFとデータバインディングを行うことができます。AttachedPropertiesServiceを使用してアクティビティクラスで独自のSatisfiesConstraintsプロパティを定義することもできます。しかし、これは余分な作業であり、実行時検証と一貫して結び付けられないため、価値が限られています。
他のヒント
public class SalesCommissionValidation : CodeActivity<decimal>
{
public decimal NetSales { get; set; }
public decimal Percentage { get; set; }
protected override decimal Execute(CodeActivityContext context)
{
var commission = NetSales * (Percentage / 100);
return commission;
}
protected override void CacheMetadata(CodeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
if (NetSales <= 0)
metadata.AddValidationError("Sales cannot be less than 0!");
else if (Percentage <= 0)
metadata.AddValidationError("Sales percentgage cannot be less than 0!");
else
{
if (Percentage > 20)
metadata.AddValidationError(string.Format("Sales percentgage {0} cannot be greater than 20%", Percentage));
}
}
}
所属していません StackOverflow