Я бы порекомендовал вам создать интерфейс IValidator, а затем создать несколько разных валидаторов, которые обрабатывают разные сценарии. Вот один пример:
public interface IValidator {
bool CanValidateType(string type);
bool Validate(string input);
}
Метод CanValidateType () может быть немного более сложным, но я надеюсь, что вы поняли идею. Это в основном определяет, может ли валидатор обрабатывать предоставленный ввод. Вот пара реализаций:
public class UrlValidator : IValidator {
bool CanValidateType(string type) {
return type.ToLower() == "url";
}
bool Validate(string input) {
/* Validate Url */
}
}
public class EmailValidator : IValidator {
bool CanValidateType(string type) {
return type.ToLower() == "email";
}
bool Validate(string input) {
/* Validate Email */
}
}
Теперь вы будете использовать инъекцию конструктора для внедрения зависимости в ваш класс:
public class SomeSimpleClass {
private IValidator validator;
public SomeComplexClass(IValidator validator) {
this.validator = validator;
}
public void DoSomething(string url) {
if (validator.CanValidateType("url") &&
validator.Validate(url))
/* Do something */
}
}
CanValidateType пригодится, когда у вас есть класс, который может использовать несколько валидаторов. В этом сценарии вы передаете список или массив валидаторов конструктору.
public class SomeComplexClass {
private List<IValidator> validators;
public SomeComplexClass (List<IValidator> validators) {
this.validators = validators;
}
public bool ValidateUrl(string url) {
foreach (IValidator validator in this.validators)
if (validator.CanValidateType("url"))
return validator.Validate(url);
return false;
}
public bool ValidateEmail(string email) {
foreach (IValidator validator in this.validators)
if (validator.CanValidateType("email"))
return validator.Validate(email);
return false;
}
}
Затем вам нужно будет как-то передать требуемый экземпляр валидатора (ов) вашим классам. Это часто делается с помощью контейнера IoC (например, Castle Windsor) или выполняется самостоятельно.
IValidator emailValidator = new EmailValidator();
IValidator urlValidator = new UrlValidator();
SomeSimpleClass simple = new SomeSimpleClass(urlValidator);
SomeComplexClass complex = new SomeComplexClass(new List<IValidator> { emailValidator, urlValidator });
Вышеприведенный код становится утомительным, и поэтому контейнеры IoC так удобны. С контейнером IoC вы можете сделать что-то вроде следующего:
SomeSimpleClass simple = container.Resolve<SomeSimpleClass>();
SomeComplexClass complex = container.Resolve<SomeComplexClass();
Все отображения интерфейсов выполняются в вашем app.config или web.config.
Вот классное руководство по внедрению зависимостей и контейнеру The Castle Windsor IoC.