Metadatatypes使用验证应用程序块进行自我验证

时间:2010-09-10 18:39:14

标签: validation enterprise-library validation-application-bl metadatatype

是否可以将selfvalidation属性与位于元数据类型中的验证一起使用?我正在使用Enterprise Library 5的验证应用程序块。

2 个答案:

答案 0 :(得分:2)

正如我在其他答案中解释的那样,开箱即用不支持。但是,这可以通过使用依赖注入挂钩到框架并替换现有的AttributeValidatorFactory实现来实现。我在博客上写了一篇关于如何执行此操作的帖子:Mixing Validation Application Block With DataAnnotation: What About SelfValidation?

我希望这会有所帮助。

答案 1 :(得分:1)

VAB目前不支持(开箱即用)。在EntLib论坛的this thread查找实例。我认为不支持的主要原因是因为您不能简单地将[SelfValidation]方法放在元数据类型上并期望它能够工作。它不起作用的原因是因为自我验证方法通常会验证该类型的实例成员。自我验证方法的签名不包含要验证的实际对象。

一个简单的解决方法是从实体调用元数据类型。例如:

[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并将其替换为能够执行此操作的版本。但这并不容易。

干杯