Какой шаблон для проверки во время разработки, в основу рабочих процессов 4.0?
Мне неясно, когда и как я должен выполнять проверку в моих пользовательских действиях / фабриках пользовательских действий/пользовательских конструкторах в WF 4.0.
Единственное место в моей деятельности, которое, кажется, обеспечивает поддержку ошибок проверки, находится в методе CacheMetadata (я считаю, что это вызывается несколько раз в процессе проектирования). Это то место, где я должен делать свою проверку? Есть ли поддержка валидации в ActivityDesigner?
2 ответа:
Да, 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 )
Ваш вторичный вопрос-есть ли поддержка для добавления проверки со стороны ActivityDesigner? Ответ: "Нет, не совсем" - можно было бы сделать некоторую пользовательскую привязку WPF и данных, которая добавляет некоторую "пользовательскую проверку" поверх ActivityDesigner, возможно, даже использовать AttachedPropertiesService для определения вашего собственного свойства SatisfiesConstraints в вашем классе activity. Но это дополнительная работа, и она не будет последовательно увязываться с проверкой во время выполнения, поэтому это ограниченная идея ценности.
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)); } } }