我不确定验证的最佳位置(使用企业库验证块)在哪里?它应该在课堂上还是在界面上?
可能影响它的事情
答案 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);
这让它对我有用。