我必须通过几个验证器验证电子邮件。我的类(EmailValidator
)包含验证器列表(RegexValidator
,MXValidator
...),它通过验证器验证电子邮件。
例如,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;
}
}
答案 0 :(得分:5)
只要一个验证器找到无效模式,就返回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循环中调用它们,在出现错误的情况下抛出并捕获异常。