是否可以将自我验证属性与位于元数据中的验证使用?我正在使用企业库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 并将其替换为能够执行此操作的版本。不过,这并不容易。

干杯

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top