Ich würde Ihnen empfehlen, eine IValidator-Schnittstelle zu erstellen und dann mehrere verschiedene Validatoren zu erstellen, die verschiedene Szenarien behandeln. Hier ist ein Beispiel:
public interface IValidator {
bool CanValidateType(string type);
bool Validate(string input);
}
Die CanValidateType() Methode könnte etwas komplizierter sein, aber ich hoffe, Sie bekommen die Idee. Es gibt im Wesentlichen an, ob der Validierer die gelieferte Eingabe verarbeiten kann. Hier sind ein paar Implementierungen:
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 */
}
}
Jetzt werden Sie Konstruktor Injektion verwenden, um die Abhängigkeit in Ihrer Klasse zu injizieren:
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 */
}
}
Die CanValidateType ist praktisch, wenn Sie eine Klasse, die mehrere Validierer verwenden können. In diesem Szenario übergeben Sie eine Liste oder ein Array von Validatoren an den Konstruktor.
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;
}
}
Sie müssten dann die erforderliche Instanz der Validator (en) in Ihre Klassen irgendwie übergeben. Dies wird oft mit einem IoC Container (wie Castle Windsor) oder selbst gemacht.
Der obige Code wird mühsam auf eigene Faust zu tun, deshalb sind IoC-Container so praktisch. Mit einem IoC-Container können Sie so etwas wie das folgende tun:
SomeSimpleClass simple = container.Resolve<SomeSimpleClass>();
SomeComplexClass complex = container.Resolve<SomeComplexClass();
Alle die Abbildung von Schnittstellen in Ihrem app.config oder web.config erfolgt.
Hier an awesome tutorial auf Dependency Injection und der Behälter Schloss Windsor IoC.
Was machen die Klassen sonst noch? Aus Gründen der Klarheit sollte eine Klasse einen einzigen Zweck haben. Die Lösung von FrustratedWithFormsDes folgt diesem Prinzip. – outis