मेरे पास एक विशेष पृष्ठ के साथ एक एएसपी.नेट एमवीसी 3 (रेजर) वेब अनुप्रयोग है, जो अत्यधिक डेटाबेस गहन है, और उपयोगकर्ता अनुभव सर्वोच्च प्राथमिकता है।एमवीसी पैटर्न का उल्लंघन किए बिना कैशिंग मॉडल को कैसे कार्यान्वित करें?
इस प्रकार, मैं इस विशेष पृष्ठ पर कैशिंग शुरू कर रहा हूं।
है जैसे कि यह वर्तमान में कैशिंग के बिना है मैं अपने नियंत्रक पतली रखने, जबकि इस कैशिंग पैटर्न लागू करने के लिए एक तरह से यह पता लगाने की कोशिश कर रहा हूँ:
public PartialViewResult GetLocationStuff(SearchPreferences searchPreferences)
{
var results = _locationService.FindStuffByCriteria(searchPreferences);
return PartialView("SearchResults", results);
}
आप देख सकते हैं, नियंत्रक बहुत पतली है , जैसा कि इसे होना चाहिए। यह इस बात की परवाह नहीं करता कि यह कैसे/कहां से इसकी जानकारी प्राप्त कर रहा है - यह सेवा का काम है।
नियंत्रण के प्रवाह पर कुछ नोट:
- नियंत्रकों एक विशेष सेवा, यह क्षेत्र पर निर्भर DI'ed मिलता है। इस उदाहरण में, इस नियंत्रक प्राप्त एक LocationService
- सेवाएं एक
IQueryable<T>
भंडार के माध्यम से कॉल है औरT
याICollection<T>
में परिणाम अमल में लाना।
कैसे मैं कैशिंग लागू करना चाहते हैं:
- मैं आउटपुट कैशिंग का उपयोग नहीं कर सकते हैं - कुछ कारणों के लिए। सबसे पहले, यह क्रिया विधि क्लाइंट-साइड (jQuery/AJAX) से
[HttpPost]
के माध्यम से लागू की जाती है, जो HTTP मानकों के अनुसार अनुरोध के रूप में कैश नहीं किया जाना चाहिए। दूसरा, मैं HTTP अनुरोध तर्कों के आधार पर पूरी तरह से कैश नहीं करना चाहता - कैश तर्क उस से बहुत जटिल है - वास्तव में दो-स्तर कैशिंग चल रहा है। - जैसा कि मैंने उपरोक्त संकेत दिया है, मुझे नियमित डेटा-कैशिंग का उपयोग करने की आवश्यकता है, उदाहरण के लिए
Cache["somekey"] = someObj;
। - मैं एक सामान्य कैशिंग तंत्र जहां सेवा के माध्यम से सभी कॉल कैश के माध्यम से पहली जाना लागू करने के लिए नहीं करना चाहते हैं - मैं केवल इस विशेष कार्रवाई विधि पर कैशिंग चाहते हैं।
पहले सोचा है (, पहले कैश चेक, अगर वहाँ db फोन नहीं कैश, वापसी परिणाम में जोड़ने के लिए) मुझे बताओ होगा एक और सेवा बनाने के लिए (जो LocationService विरासत में), और वहाँ कैशिंग कार्यप्रवाह प्रदान करते हैं।
दो समस्याएं हैं यही कारण है कि: - इसके अलावा कुछ भी करने के लिए कोई संदर्भ
- सेवाओं बुनियादी कक्षा पुस्तकालय हैं। मुझे यहां
System.Web
का संदर्भ जोड़ने की आवश्यकता होगी। - मुझे वेब एप्लिकेशन के बाहर HTTP संदर्भ का उपयोग करना होगा, जिसे केवल खराबता माना जाता है, न केवल टेस्टेबिलिटी के लिए, बल्कि सामान्य रूप से - सही?
मैं भी एक मॉडल फ़ोल्डर में एक कैश सेवा वेब अनुप्रयोग (जो मैं वर्तमान में ViewModels के लिए ही इस्तेमाल करते हैं) में Models
फ़ोल्डर का उपयोग कर, लेकिन होने सिर्फ सही नहीं लग रहा बारे में सोचा।
तो - कोई विचार? क्या कोई एमवीसी-विशिष्ट चीज है (जैसे एक्शन फ़िल्टर, उदाहरण के लिए) मैं यहां उपयोग कर सकता हूं?
सामान्य सलाह/सुझावों की बहुत सराहना की जाएगी।
'" मैं केवल इस विशेष क्रिया विधि पर कैशिंग करना चाहता हूं "- लगता है जैसे आप एक एक्शनफिल्टर समाधान मांग रहे हैं। – Omar