【发布时间】:2009-01-19 08:26:18
【问题描述】:
我不确定放置验证(使用企业库验证块)的最佳位置在哪里?它应该在类上还是在界面上?
可能影响它的事情
- 从接口继承的类中不会更改验证规则。
- 从类继承的类中不会更改验证规则。
- 在大多数情况下会从类继承 - 我怀疑一些边缘情况会从接口继承(但我会尽量避免它)。
- 接口主要用于 DI,这将通过 Unity 块完成。
【问题讨论】:
标签: validation class interface enterprise-library
我不确定放置验证(使用企业库验证块)的最佳位置在哪里?它应该在类上还是在界面上?
可能影响它的事情
【问题讨论】:
标签: validation class interface enterprise-library
您尝试将验证块与 DI 一起使用的方式,如果您在接口级别设置属性,我认为这不是问题。另外,我认为它不应该在继承链中产生问题。但是,我大多看到这个块在类级别使用,目的是保持接口不过度指定事物。 IMO 我不认为这样做有很大的威胁。
【讨论】:
这里要非常小心,你的测试太简单了。
这对于 SelfValidation Validators 或 Class Validators 将无法正常工作,仅适用于您拥有的简单属性验证器。
另外,如果您在 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);
这让它对我有用。
【讨论】: