मैंने एसओ पर यहां बहुत सारे शोध किए हैं, और मुझे स्पष्ट दिशा नहीं मिल रही है। मेरे पास वर्तमान में एक एएसपी.नेट एमवीसी 3 एप्लीकेशन है, एक सेवा परत के साथ जो एक भंडार के शीर्ष पर बैठता है।मैं सेवा परत सत्यापन संदेशों को कॉलर पर वापस कैसे पास कर सकता हूं?
public class MyService{
public void CreateDebitRequest(int userId, int cardId, decimal Amount, ....)
{
//perform some sort of validation on parameters, save to database
}
public void CreateCreditRequest(.....)
}
//perform some sort of validation on parameters, save to database
}
public void CreateBatchFile()
{
//construct a file using a semi-complex process which could fail
//write the file to the server, which could fail
}
public PaymentTransaction ChargePaymentCard(int paymentCardId, decimal amount)
{
//validate customer is eligible for amount, call 3rd party payments api call,
//...save to database, other potential failures, etc.
}
}
मैंने देखा है लोगों का कहना है कि पैरामीटर मान्यता बहुत असाधारण नहीं है, और इसलिए एक अपवाद फेंकने बहुत फिटिंग नहीं है:
मेरी सेवा परत में, मैं इस तरह के रूप में कार्य करता है। मुझे एक स्ट्रिंग जैसे आउट पैरामीटर में गुजरने के विचार से भी प्यार नहीं है, और एक खाली मूल्य की जांच कर रहा है। मैंने एक वैलिडेशन डिक्शनरी क्लास को कार्यान्वित करने पर विचार किया है, और इसे किसी दिए गए सेवा वर्ग की संपत्ति बना रहा है (इसमें एक इस्वाइड बूलियन होगा, और त्रुटि संदेशों की एक सूची होगी, और यह देखने के लिए सेवा परत में दिए गए फ़ंक्शन कॉल के बाद चेक किया जा सकता है चीजें चली गईं)। मैं किसी भी समारोह चलाने के बाद ValidationDictionary स्थिति की जांच कर सकते हैं:
var svc = new MyService();
svc.CreateBatchFile();
if (svc.ValidationDictionary.IsValid)
//proceed
else
//display values from svc.ValidationDictionary.Messages...
बात मैं इस बारे में पसंद नहीं है कि मैं हर सेवा परत समारोह कॉल के लिए यह अद्यतन करने के लिए, यह पुराने मूल्यों को बनाए रखने के होने से बचाने के लिए होता है (यदि मैंने इसे कई या अधिकतर कार्यों के लिए उपयोग नहीं करना चुना है, तो किसी भी दिए गए फ़ंक्शन को चलाने के बाद भी यह एक सार्थक या शून्य मूल्य होने की उम्मीद करेगा)। एक और चीज जिसे मैंने माना है वैलीडेशन डिक्शनरी में प्रत्येक फंक्शन कॉल के लिए गुजर रहा है जिसमें विस्तृत सत्यापन जानकारी हो सकती है, लेकिन फिर मैं आउट पैरामीटर का उपयोग करने के लिए वापस आ गया हूं ...
क्या आपके पास कोई सिफारिश है? मुझे ऐसा करने का कोई साफ तरीका नहीं दिख रहा है। कभी-कभी फ़ंक्शन के लिए शून्य लौटने पर पर्याप्त जानकारी होती है, लेकिन कभी-कभी मैं कॉलर को वापस एक और अधिक सत्यापन जानकारी वापस लेना चाहता हूं। किसी भी सलाह की सराहना की जाएगी!
स्पष्टीकरण के लिए संपादित करें: मेरी सेवा परत को पता नहीं है कि यह एक एमवीसी एप्लीकेशन है जो इसका उपभोग कर रहा है। सेवा परत में केवल कुछ सार्वजनिक फ़ंक्शन हैं जैसे CreateBatchFile() या AddDebitRequest()। कभी-कभी उपभोक्ता के लिए पर्याप्त नल पर्याप्त होता है (इस मामले में एक नियंत्रक, लेकिन कुछ और हो सकता है) यह जानने के लिए कि क्या हुआ, और कभी-कभी उपभोक्ता सेवा परत से कुछ और जानकारी चाहेंगे (शायद उपभोक्ता है तो मॉडलस्टेट के साथ पास करने के लिए एक नियंत्रक)। मैं सेवा परत से इसे कैसे बबल कर सकता हूं?
हमम ... मुझे लगता है कि मैं निचले स्तर के बारे में बात कर रहा हूं। हम मान लेंगे कि उपयोगकर्ता ने एक बटन दबाया है, और व्यूमोडेल सत्यापन बिना छेड़छाड़ के चला गया है। मेरा नियंत्रक तब सेवा परत के भीतर एक फ़ंक्शन कॉल करेगा, और यह फ़ंक्शन कई कारणों से विफल हो सकता है (या शायद दृश्यमान सत्यापन वास्तव में आवश्यक सेवा की तुलना में अधिक उदार था, इसलिए जब सेवा स्वयं के लिए पैराम को मान्य करती है, तो यह विफल हो जाती है) । मैं इस जानकारी को सेवा परत से नियंत्रक तक वापस कैसे पास करूंगा, यहां तक कि उस बिंदु तक पहुंचने के लिए जहां मैं व्यूमोडेल या मॉडलस्टेट के साथ प्रदर्शित कर सकता हूं? – Josh
मैं सुनिश्चित करता हूं कि सभी सत्यापन तर्क व्यूमोडेल में मौजूद हैं। आप सभी जगह पर सत्यापन तर्क क्यों फैलाना चाहते हैं? इनपुट सत्यापन उपयोगकर्ता इंटरफ़ेस मॉड्यूल में आता है। अगर सेवा परत में कुछ गड़बड़ है तो आपको बेहतर त्रुटि संदेशों के साथ लॉगिंग प्रदान करने के लिए अपवाद फेंकना चाहिए। आपका एमवीसी एप्लीकेशन अपवाद/http कोड के आधार पर दोस्ताना त्रुटि पृष्ठों पर रीडायरेक्ट कर सकता है। – Marcus
मान लें कि मैं सेवा परत में हूं, और यह सत्यापित करता हूं कि CreateDebitRequest (...) में पारित दिनांक भविष्य में तीन दिनों से अधिक नहीं है। ऐसा लगता है कि मुझे सेवा परत में इसे यहां सत्यापित करना चाहिए, इसके अलावा जहां भी मैंने इसे श्रृंखला में उच्चतर मान्य किया है। क्या आप उस के साथ सहमत करेंगें? यदि ऐसा है, तो क्या आपको लगता है कि मुझे वास्तव में मेरी सेवा परत में सत्यापन करना चाहिए, लेकिन सत्यापन विफल होने पर केवल अपवाद फेंकना चाहिए? या मुझे इस सेवा को मेरी सेवा परत में बिल्कुल मान्य नहीं करना चाहिए (मैं सेवा उपभोक्ता पर भरोसा करने के बारे में परेशान होगा)? धन्यवाद ... – Josh