为每个提供商实施电子邮件验证的正确设计模式是什么?

时间:2012-05-01 12:38:04

标签: c# design-patterns

我必须通过几个验证器验证电子邮件。我的类(EmailValidator)包含验证器列表(RegexValidatorMXValidator ...),它通过验证器验证电子邮件。 例如,RegexValidator为每个提供商都有自己的验证器。如果它识别出这是 gmail ,那么它会检查它是否与特定模式匹配,如果它是 mygmail ,那么它会检查它是否与mygmail的模式匹配,否则它返回true。 MXValidator将验证其他内容。

实现此目的的正确设计模式是什么?

public interface IValidator
{
   bool Validate(string email);
}
public class RegexValidator : IValidator
    {
        private const string EMAIL_REGEX = @"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b";
        public bool Validate(string email)
        {
            var regex = new Regex(EMAIL_REGEX);
            var isEmailFormat regex.IsMatch(email);
            if(isEmailFormat)
            {
                 //here it should recognize the provider and check if it match the provider's pattern
            }

            return true;
        }
    }

2 个答案:

答案 0 :(得分:5)

Chain of Responsibility.

只要一个验证器找到无效模式,就返回false。您传递了有序验证器列表。

bool ValidateEmail(string email, IEnumerable<IValidator> validators, ref errorMessage)
{
    return !validators.Any(v => !v.Validate(email, ref errorMessage);
}

假设

interface IValidator
{
    bool Validate(object value, ref errorMessage);
}

更新

我认为这是另一个验证器:

public class EmailDomainValidator : IValidator
{

   public EmailDomainValidator(string domain)
   {
      _domain = domain;
   }

   ...
}

答案 1 :(得分:0)

这不是你问题的直接答案,但我认为你做错了。

电子邮件的真实验证不是基于他的字符串表示,而是基于简单的测试。你发邮件,有人回答,邮件是好的。否则它很糟糕。

您的无效有效邮件地址在现实世界中无效,因为它们与邮箱无关。

也许你已经意识到这一点,这是你的工作,但如果不是,我建议你制作一个非常简单和宽容的正则表达式:

(?<=[\w-\.@]+@)[\w-\.]+

只会向你显示@之后的部分,并且会包含很多可以轻松测试的误报。


关于链接验证器,我将创建一个包含所有测试的List<Func<string,bool>>,并在foreach循环中调用它们,在出现错误的情况下抛出并捕获异常。

编辑:事实上,使用lambda的LINQ方法要好得多。抛出异常是很昂贵的。