【问题标题】:C# Custom Object Validation DesignC# 自定义对象验证设计
【发布时间】:2010-11-20 09:18:08
【问题描述】:

我目前必须为我的应用程序验证自定义字段对象。简单地说,每个 Field 对象都包含有关字段验证的信息以及字段的值。 我正在批量验证字段,所以目前,我有一个验证类,每个验证都有一个方法。对于必填字段,它看起来像这样:

      private void RequiredFields()
      {
            foreach (Field field in allFields)
            {
                if ((field.Required == true) && (field.Value == string.Empty))
                {
                    field.isValid = false;
                }
            }
      }

现在我的问题是我觉得我应该对验证进行一层抽象,所以不要说:

if ((field.Required == true) && (field.Value == string.Empty))

...我会添加一个验证类,以接受这些值并将其转换为:

if (!validater.RequiredFields(field.Required, field.Value))

如果我这样做,它将允许我在不使用字段对象的情况下重用验证类,并且还可以进行更好的单元测试......但是,这似乎是不必要的抽象层,而且在某种程度上重复...请记住,这是所有验证中最简单的。

建议?

【问题讨论】:

    标签: c# .net validation abstraction


    【解决方案1】:

    为什么不让 Field 对象负责自己的验证?

    class Field
    {
        public bool Required { get; }
        public string Value { get; set; }
    
        // assuming that this method is virtual here
        // if different Fields have different validation logic
        // they should probably be separate classes anyhow and
        // simply implement a common interface of inherit from a common base class.
        public override bool IsValid
        {
            get { return Required && Value != String.Empty; }
        }
    }
    

    【讨论】:

    • 我对此表示赞同,但我会犹豫是否让不需要的字段始终无效。
    • 嗯,我确实考虑过这一点。但是,我正在验证大约 100 个字段,所有字段都有不同的验证,其中只有一些是特定于字段对象的。我想一起进行验证。
    • 如果你在验证 100 个字段,所有这些都需要不同的验证逻辑,并且只有一部分是你自己的自定义类,那么我会说你有更深的设计缺陷。
    • 我建议每个 Field 都应该是“Field”类型,但在需要时可以扩展 Field 类。现在每个字段对象都公开相同的接口,您只需询问每个字段“您是否有效?”
    • 您的验证逻辑如此不同的事实应该促使您使用多态性来发挥自己的优势。
    猜你喜欢
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多