2

いくつかのバリデーターを介して電子メールを検証する必要があります。バリデーター( 、 ...)EmailValidatorのリストを持つclass( )があり、そのバリデーターを介して電子メールを検証します。 たとえば、プロバイダーごとに独自のバリデーターがあります。これがgmailであると認識した場合、特定のパターンに一致するかどうかを確認します。mygmailの場合は mygmailのパターンに一致するかどうかを確認します。それ以外の場合は、trueを返します。 他の何かを検証します。RegexValidatorMXValidatorRegexValidatorMXValidator

これを実装するための正しいデザインパターンは何ですか?

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

2 に答える 2

5

責任の連鎖。

1つのバリデーターが無効なパターンを見つけるとすぐに、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;
   }

   ...
}
于 2012-05-01T12:42:05.450 に答える
0

それはあなたの問題に対する直接の答えではありませんが、あなたはそれを間違っていると思います。

電子メールの実際の検証は、彼の文字列表現に基づくのではなく、簡単なテストに基づいています。あなたはメールを送ります、誰かが答えます、メールは良いです。そうでなければそれは悪いです。

メールボックスに関連していないため、現実の世界では無効な有効なメールアドレスが無限にあります。

おそらくあなたはすでにそれを知っていて、これを行うのはあなたの仕事ですが、そうでない場合は、次のような本当にシンプルで寛容な正規表現を作成することをお勧めします。

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

Wichは、@の後の部分のみを表示し、簡単にテストできる多くの誤検知が含まれます。


バリデーターのチェーンについては、List<Func<string,bool>>すべてのテストを含むウィッチを作成し、それらすべてをforeachループで呼び出し、falseの場合に例外をスローしてキャッチします。

編集:実際、ラムダを使用したLINQメソッドの方がはるかに優れています。例外をスローするとコストがかかります。

于 2012-05-01T13:03:37.877 に答える