मेरे वर्तमान अनुप्रयोगों में से एक में, मुझे वेबसाइट सेवा/एसओएपी के माध्यम से रिमोट सेवा (सीआरएम) से ग्राहक डेटा प्राप्त करने की आवश्यकता है। लेकिन मैं mysql डेटाबेस में डेटा को कैश करना चाहता हूं, ताकि मुझे अगली बार webservice से कनेक्ट करने की आवश्यकता न हो (डेटा अक्सर बदलता नहीं है, दूरस्थ सेवा धीमी है और बैंडविड्थ सीमा है - इसलिए कैशिंग ठीक है/जरूरी है)।डेटाबेस में कैश नहीं होने पर दूरस्थ सेवा से डेटा प्राप्त करना - सुझाव की आवश्यकता
मुझे इस कार्य के तकनीकी भाग के बारे में काफी यकीन है, लेकिन मुझे इस वेब ऐप में इस स्वच्छ और पारदर्शी को कार्यान्वित करने के बारे में इतना यकीन नहीं है।
मेरा अन्य डेटा एक ही MySQL डेटाबेस से आता है, इसलिए मैं रिपॉजिटरीज़ जो एनएचबीर्नेट के साथ डेटाबेस से पूछे गए सूचियों या एकल इकाइयों को वापस लौटाता हूं।
मेरे विचारों अब तक:
1 सब एक प्रयोग में
एक CustomerRepository, जो ईद द्वारा ग्राहक के लिए लग रहा है, यदि सफल, तो यह वापसी, और वेब सेवा कॉल और पुनर्प्राप्त डेटा को डेटाबेस में सहेजें।
नियंत्रक इस तरह दिखता है:
class Controller
{
private CustomerRepository Rep;
public ActionResult SomeAction(int id)
{
return Json(Rep.GetCustomerById(id));
}
}
छद्म में भंडार/इस तरह सरल कोड:
class CustomerRepository
{
public Customer GetCustomerById(int id)
{
var cached = Database.FindByPK(id);
if(cached != null) return cached;
var webserviceData = Webservice.GetData(id);
var customer = ConvertDataToCustomer(webserviceData);
SaveCustomer(customer);
return customer;
}
}
हालांकि उपरोक्त कुछ हद तक सरल लग रहा है, मुझे लगता है कि CustomerRepository वर्ग काफी बड़ी और बदसूरत बढ़ेगा । तो मुझे उस दृष्टिकोण को बिल्कुल पसंद नहीं है।
एक संग्रह को केवल डेटाबेस से डेटा लोड करना चाहिए, जो कम से कम मेरे ऐप में "अनुबंध" होना चाहिए।
2 sepereate और भंडार (db पहुँच) और वेब सेवा (दूरदराज के उपयोग) के लिए
उपयोग अलग कक्षाओं नियंत्रक में एक साथ स्टिक किया और जाने नियंत्रक काम करते हैं:
नियंत्रक ऐसा लगता है:
class Controller
{
private CustomerRepository Rep;
private Webservice Service;
public ActionResult SomeAction(int id)
{
var customer = Rep.GetCustomerById(id);
if(customer != null) return Json(customer);
var remote = Service.GetCustomerById(id);
Rep.SaveCustomer(remote);
return Json(remote);
}
}
हालांकि यह थोड़ा बेहतर दिखता है, मैं अभी भी उन सभी लोगो को रखना पसंद नहीं करता नियंत्रक में सी, क्योंकि अगर सेवा वापस नहीं लौटाती है तो त्रुटि प्रबंधन को छोड़ दिया जाता है और शायद कुछ और चीजों को अव्यवस्थित कर सकता है।
शायद मैं नियंत्रक द्वारा उपयोग की जाने वाली एक और सेवा परत बना सकता हूं, लेकिन कोड काफी समान होगा, लेकिन किसी अन्य वर्ग में।
दरअसल मैं अपने नियंत्रक को एक इंटरफ़ेस/कक्षा का उपयोग करना चाहता हूं, जो उस सामान को समाहित करता है, लेकिन मुझे एक वर्ग नहीं चाहिए जो "यह सब करता है": भंडार तक पहुंच, webservice तक पहुंच, डेटा को सहेजना .. । यह कुछ हद तक मेरे लिए गलत लगता है ...
सभी विचारों अब तक कर रहे हैं/शायद कैशिंग कोड, त्रुटि हैंडलिंग, आदि मुझे लगता है कि के साथ काफी फूला हुआ हो जाएगा।
शायद मैं एओपी का उपयोग करके कुछ चीजें साफ़ कर सकता हूं?
आप उपरोक्त की तरह सामान लागू करेंगे?
तकनीकी ढांचे का उपयोग किया गया: एएसपी.नेट एमवीसी, डीआई के लिए स्प्रिंग.NET, ओआरएम के रूप में एनएचबीरनेट, डेटाबेस के रूप में mysql, दूरस्थ सेवा SOAP के माध्यम से उपयोग की जाती है।
ओह, मुझे आपके उत्तर से भी ज्यादा पसंद है! अच्छा लगा। –
अब यह वास्तव में एक दिलचस्प दृष्टिकोण है – Max
@ मैक्स: सजावट एक ऐसा पैटर्न है जो DI में बहुत से उपयोग को देखता है - अन्य चीजों के साथ परिदृश्य में बिल्कुल इस तरह की :) :) –