1

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

可能影响它的事情

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

4 回答 4

1

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

于 2009-01-19T20:22:30.743 回答
1

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

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

此外,如果您在 ASP.NET 页面中使用 PropertyProxyValidator,我也不相信它会起作用,因为它只看起来是一个字段验证器,而不是继承/实现的验证器......

是的,如果你问我,VAB 上有大洞。

于 2009-11-09T19:18:30.860 回答
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; }
}
}
于 2009-01-20T05:54:18.687 回答
0

您的代码示例使用什么版本的企业库?我使用 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);

这让它为我工作。

于 2012-04-05T18:49:59.907 回答