【问题标题】:Enterprise Library Validation Block - Should validation be placed on class or interface?企业库验证块 - 应该将验证放在类还是接口上?
【发布时间】:2009-01-19 08:26:18
【问题描述】:

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

可能影响它的事情

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

【问题讨论】:

    标签: validation class interface enterprise-library


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      这对于 SelfValidation Validators 或 Class Validators 将无法正常工作,仅适用于您拥有的简单属性验证器。

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

      如果你问我的话,是的,VAB 有很大的漏洞..

      【讨论】:

        【解决方案3】:

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

        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; }
        }
        }
        

        【讨论】:

          【解决方案4】:

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

          这让它对我有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-30
            相关资源
            最近更新 更多