我建议您创建一个 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 中完成。
这里是 an awesome tutorial 依赖注入和温莎城堡 IoC 容器。