企业库验证块 - 是否应该在类或接口上进行验证?

时间:2009-01-19 08:26:19

标签: validation class interface enterprise-library

我不确定验证的最佳位置(使用企业库验证块)在哪里?它应该在课堂上还是在界面上?

可能影响它的事情

  • 在从接口继承的类中不会更改验证规则。
  • 在从类继承的类中不会更改验证规则。
  • 在大多数情况下,类会发生继承 - 我怀疑某些边缘情况要从接口继承(但我会尽量避免它)。
  • 接口主要用于DI,将使用Unity块完成。

4 个答案:

答案 0 :(得分:1)

您尝试将验证块与DI一起使用的方式,如果您在接口级别设置属性,我不认为这是一个问题。另外,我认为它不应该在继承链中产生问题。但是,我大多看到在类级别使用此块,其目的是保持接口不会指定内容。 IMO我没有看到这样做的巨大威胁。

答案 1 :(得分:1)

在这里要非常小心,你的测试太简单了。

对于SelfValidation Validators或Class Validators,这不会像您期望的那样工作,只适用于那里的简单属性验证器。

另外,如果你在ASP.NET页面中使用PropertyProxyValidator,我不相信它也可以工作,因为它只查看字段验证器,而不是继承/实现的验证器......

如果你问我,那就是VAB的大洞......

答案 2 :(得分:0)

为了完整起见,我决定写一个小测试,以确保它能按预期工作,而且确实如此,我只是在这里发布,以防将来有人想要它。

using System;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

namespace ConsoleApplication1
{
    class Program
    {
    static void Main(string[] args)
    {
        ISpike spike = new Spike();
        spike.Name = "A really long name that will fail.";
        ValidationResults r = Validation.Validate<ISpike>(spike);
        if (!r.IsValid)
        {
            throw new InvalidOperationException("Validation error found.");
        }

    }
}

public class Spike : ConsoleApplication1.ISpike
{
    public string Name { get; set; }
}

interface ISpike
{
    [StringLengthValidator(2, 5)]
    string Name { get; set; }
}
}

答案 3 :(得分:0)

您的代码示例使用的是哪个版本的Enterprise Library?我尝试使用Enterprise Library 5.0,但它没有用。

我将其跟踪到EL5.0源代码中的以下代码部分:

[namespace Microsoft.Practices.EnterpriseLibrary.Validation]
[public static class Validation]

public static ValidationResults Validate<T>(T target, ValidationSpecificationSource source)
{
    Type targetType = target != null ? target.GetType() : typeof(T);
    Validator validator = ValidationFactory.CreateValidator(targetType, source);
    return validator.Validate(target);
}

如果定义了目标对象,则target.GetType()将返回最具体的类定义,而不是接口定义。

我的解决方法是替换你的行:

ValidationResults r = Validation.Validate<ISpike>(spike);

使用:

ValidationResults r ValidationFactory.CreateValidator<ISpike>().Validate(spike);

这让它对我有用。