मैं आपको एक 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;
}
}
आपको किसी भी तरह से अपने वर्गों में वैधकर्ता के आवश्यक उदाहरण में पास करना होगा। यह अक्सर आईओसी कंटेनर (कैसल विंडसर की तरह) के साथ किया जाता है या इसे स्वयं करता है।
IValidator emailValidator = new EmailValidator();
IValidator urlValidator = new UrlValidator();
SomeSimpleClass simple = new SomeSimpleClass(urlValidator);
SomeComplexClass complex = new SomeComplexClass(new List<IValidator> { emailValidator, urlValidator });
उपरोक्त कोड स्वयं को करने के लिए कठिन हो जाता है, यही कारण है कि आईओसी कंटेनर इतने आसान हैं।
SomeSimpleClass simple = container.Resolve<SomeSimpleClass>();
SomeComplexClass complex = container.Resolve<SomeComplexClass();
सभी इंटरफेस के मानचित्रण अपने app.config या web.config में किया जाता है: एक आईओसी कंटेनर के साथ आप निम्नलिखित की तरह कुछ कर सकते हैं।
निर्भरता इंजेक्शन और कैसल विंडसर आईओसी कंटेनर पर an awesome tutorial है।
कक्षाएं और क्या करती हैं? स्पष्टता के लिए, एक वर्ग के पास एक ही उद्देश्य होना चाहिए। निराश WithFormsDes का समाधान इस सिद्धांत का पालन करता है। – outis