我不确定放置验证(使用企业库验证块)的最佳位置在哪里?它应该在类上还是在界面上?
可能影响它的事情
- 从接口继承的类中不会更改验证规则。
- 从类继承的类中不会更改验证规则。
- 在大多数情况下,类会发生继承——我怀疑一些边缘情况会从接口继承(但我会尽量避免它)。
- 接口主要用于 DI,这将通过 Unity 块完成。
我不确定放置验证(使用企业库验证块)的最佳位置在哪里?它应该在类上还是在界面上?
可能影响它的事情
您尝试将验证块与 DI 一起使用的方式,如果您在接口级别设置属性,我认为这不是问题。另外,我认为它不应该在继承链中产生问题。但是,我大多看到这个块在类级别使用,目的是保持接口不过度指定事物。IMO 我不认为这样做有很大的威胁。
这里要非常小心,你的测试太简单了。
对于 SelfValidation 验证器或类验证器,这不会像您期望的那样工作,仅适用于您那里的简单属性验证器。
此外,如果您在 ASP.NET 页面中使用 PropertyProxyValidator,我也不相信它会起作用,因为它只看起来是一个字段验证器,而不是继承/实现的验证器......
是的,如果你问我,VAB 上有大洞。
为了完整起见,我决定编写一个小测试以确保它能够按预期工作并且确实如此,我只是将其发布在这里以防其他人将来需要它。
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; }
}
}
您的代码示例使用什么版本的企业库?我使用 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);
这让它为我工作。