使用验证应用程序块具有自然验证的元数据
题
是否可以将自我验证属性与位于元数据中的验证使用?我正在使用企业库5的验证应用程序块。
解决方案
正如我在其他答案中解释的那样,这不支持开箱即用。但是,这可以通过使用Depeenty注入并替换现有的框架来实现 AttributeValidatorFactory
执行。我在博客上写了一篇关于如何做到这一点的文章: 混合验证应用程序块与数据通量:自我验证呢?
我希望这有帮助。
其他提示
VAB目前不支持(开箱即用)。例如 这个线程 在Entlib论坛上。我认为不支持的主要原因是因为您不能简单地将[自我验证]方法放在元数据类型上,并期望这能起作用。它行不通的原因是因为自验证方法通常会验证该类型的实例成员。自验证方法的签名不包含要验证的实际对象。
围绕的简单工作是从实体中调用元数据类型。例如:
[MetadataType(typeof(InvoiceMetaData))]
[HasSelfValidation]
public partial class Invoice
{
public string Name{ get; set; }
public int Price { get; set; }
[SelfValidation]
public void CustomValidate(ValidationResults results)
{
// Call into the meta data class
InvoiceMetaData.Validate(this, results);
}
}
public class InvoiceMetaData
{
[StringLengthValidator(1, 10, Tag = "Name")]
string Name { get; set; }
[RangeValidator(0, RangeBoundaryType.Inclusive, 0,
RangeBoundaryType.Ignore, Tag = "Price")]
int Price { get; set; }
public static void CustomValidate(Invoice instance,
ValidationResults results)
{
results.AddResult(new ValidationResult("ErrorMessage1",
instance, "", "", null));
}
}
当然,这不是一个非常干净的解决方案。但是,VAB非常可扩展,并且版本5.0只会变得更好。如果愿意,可以交换现有 AttributeValidationFactory
并将其替换为能够执行此操作的版本。不过,这并不容易。
干杯
不隶属于 StackOverflow