2012-04-30 9 views
6

मैं वर्तमान में एक ई-कॉमर्स साइट पर काम कर रहा हूं और एक सुविधा है कि मुझे यह सुनिश्चित नहीं है कि इसे कैसे कार्यान्वित किया जाए। अधिकांश समय आप अपने कार्ट में उत्पाद जोड़ते हैं और उन्हें खरीदते हैं, यह शायद सबसे सरल वर्कफ़्लो है। मैं जो पूछ रहा हूं वह थोड़ा अलग है, अगर उत्पाद खरीदने के लिए समय सीमा है तो क्या होगा? मेरा मतलब है कि कुछ साइटें आपको उत्पाद (जैसे सॉकर मैनेजर) खरीदने के लिए सटीक समय सीमा देती हैं, उन साइटों में आप हमेशा के लिए उत्पाद नहीं रख सकते हैं, इसके लिए 15 मिनट की सीमा है और यदि आप उस अवधि में खरीद नहीं लेते हैं, तो आइटम अपने कार्ट से रिहा किया जाना चाहिए। (और शायद कोई और इस पर कूद जाएगा)एएसपी.नेट एमवीसी 3 साइट में पृष्ठभूमि नौकरियां कैसे करें?

अब, एएसपी.नेट एमवीसी प्रोग्रामर के रूप में मुझे इस सुविधा को लागू करना अच्छा लगेगा, लेकिन जैसा कि मैंने कहा, मुझे यकीन नहीं है कि यह कैसे करें। मुझे लगता है कि जब मैं कार्ट में आइटम जोड़ता हूं तो मुझे समय (आइटम जैसे कुछ जोड़ा गया) पकड़ने की आवश्यकता होती है और मुझे उस आइटम को x मिनट में रिलीज़ करने की आवश्यकता होती है, इसलिए उस उत्पाद को रिलीज़ करने के लिए कुछ मिनट बाद चलाने की आवश्यकता होती है। वैश्विक स्तर पर सोचते हुए, मुझे लगता है कि मुझे एक सेवा चाहिए, जब मैं कोई आइटम जोड़ूं, मुझे इसे इस सेवा में सदस्यता लेने की भी आवश्यकता है और सेवा पृष्ठभूमि में टाइमर/नौकरी चलाती है। मुझे क्या पता नहीं है/इसका कोई अनुभव नहीं है, यह एक एएसपी.नेट एमवीसी प्रोजेक्ट में ऐसा कैसे करें, क्या कोई नमूना प्रोजेक्ट, आलेख, लाइब्रेरी या ऐसा कुछ है?

बेशक मुझे नहीं पता कि मेरा तर्क इस समस्या के लिए सही है या नहीं, मुझे कुछ मार्गदर्शन कोड चाहिए, यदि संभव हो तो कुछ स्रोत कोड काम करने के लिए।

उत्तर

4

AFAIK एक एमवीसी परियोजना के भीतर घोषित/प्रोग्राम कार्यों का कोई मानक तरीका नहीं है। जो भी आप चाहते हैं उसे पूरा करने के लिए अनुशंसित तरीका आपके समाधान के भीतर एक नया कंसोल एप्लिकेशन प्रोजेक्ट बनाना होगा, और प्रत्येक एक्स मिनट को निष्पादित करने के लिए विंडोज टास्क शेड्यूलर का उपयोग करना होगा, किसी भी कार्ट में एक्स मिनट से अधिक होने वाले किसी भी उत्पाद को जारी करना होगा।

इसके लिए काम करने के लिए, आपको अपने एमवीसी प्रोजेक्ट को नए से (सभी मॉडलों तक पहुंच प्राप्त करने के लिए) या इससे भी बेहतर, क्लास लाइब्रेरी प्रोजेक्ट बनाने, अपने मॉडल/डेटाबेस कक्षाओं को स्थानांतरित करने और संदर्भित करने की आवश्यकता होगी, और इसे एमवीसी और कंसोल परियोजनाओं से संदर्भित करें।


सभी ही कहा जा रहा है, वहाँ वास्तव में है एक छोटा सा "हैक" है कि एक MVC परियोजना में कार्य के लिए प्रोग्राम करने के लिए इस्तेमाल किया जा सकता।

HttpContext.Current.Cache.Add("Task", "1", null, 
      DateTime.MaxValue, TimeSpan.FromMinutes(5), 
      CacheItemPriority.Normal, new CacheItemRemovedCallback(CheckCarts)); 

कि लाइन, कि कहा जा सकता है, उदाहरण के लिए, Global.asax से, कैश करने के लिए एक "टास्क" प्रविष्टि जोड़ना होगा: आप निम्नलिखित कोड का उपयोग कर सकते हैं। संग्रहीत मूल्य ("1") महत्वपूर्ण नहीं है, महत्वपूर्ण बात यह है कि कैश प्रविष्टि पांच मिनट में समाप्त हो जाती है और, जब समाप्त हो जाती है, तो "चेककार्ट्स" विधि (ग्लोबल.एक्सएक्स में परिभाषित, या कक्षा में आप निष्पादित होते हैं) यह कोड)।

public void CheckCarts(string key, object value, CacheItemRemovedReason reason) { 
    // Insert your code here to check for expired carts 
    (...) 

    // We add the entry again to the cache, so that this method will be called again in 5 minutes. 
    HttpContext.Current.Cache.Add("Task", "1", null, 
      DateTime.MaxValue, TimeSpan.FromMinutes(5), 
      CacheItemPriority.Normal, new CacheItemRemovedCallback(CheckCarts)); 
} 

जब कैश समाप्त हो रहा है, CheckCarts विधि कहा जाता है, अपने कोड करता है जो कुछ भी यह करने के लिए है, और अंत में फिर से कैश करने के लिए खुद को कहते हैं, एक और 5 मिनट में कहा जाता है।

+0

सबसे पहले, विस्तृत स्पष्टीकरण के लिए धन्यवाद ^^ मुझे लगता है कि मैं विंडोज टास्क शेड्यूलर को पसंद नहीं करूंगा क्योंकि मैं समझता हूं कि अगर मैं शेड्यूलर का उपयोग करता हूं तो मुझे उस सेवा को बहुत कम अवधि के साथ चलाने की ज़रूरत है या समाप्ति समय और अगले निर्धारित समय के बीच बड़ा समय अंतराल होगा। आईएमएचओ आपका दूसरा समाधान अधिक रोमांचक है क्योंकि यह आपको एक सटीक ट्रिगर देता है और ऐसा लगता है कि इसे आसानी से कार्यान्वित किया जा सकता है लेकिन मेरे दिमाग में एक सवाल है, कैशइटम रीमेड कैलबैक इस तरह के समाधानों में उपयोग करने के लिए पर्याप्त विश्वसनीय है? –

+0

उस तरह के पुनरावर्ती कार्यान्वयन के साथ-साथ काम भी हो सकता है, लेकिन मैंने तुरंत इस मामले में कॉल स्टैक आकार के बारे में चिंता करने लगे –

+0

@ArtemNikolov हम वास्तव में उसी कारण से उसी कोड का उपयोग करते थे (यह वर्तमान में ई-कॉमर्स में काम कर रहा है मुक्त स्टॉक), और यह लगभग 4 वर्षों तक चल रहा है, इसलिए मुझे ऐसा लगता है :) – salgiza

3

यह परिदृश्य सिग्नलआर को चिल्लाता है। यह आपको एक सरल तरीके से जो कुछ भी पूछ रहा है वह करने की अनुमति देगा।

यदि आपके कार्ट में आइटम की समाप्ति तिथि है तो यदि कोई आइटम समाप्त हो गया है तो आप अपना व्यू पोल प्राप्त कर सकते हैं। अगर वे हैं कि आप उस आइटम के लिए हटाने कोड चला सकते हैं और अपना यूई अपडेट कर सकते हैं।

+1

मैं सहमत हूं। हटाने से कोई फर्क नहीं पड़ता जब तक आप अपना कार्ट देखने की कोशिश नहीं करते। तो इस पृष्ठभूमि की प्रक्रिया को बिल्कुल क्यों चलाएं? इसे प्रदर्शित करने से पहले बस समाप्ति के लिए कार्ट की जांच करें। यह आपको छोड़े गए गाड़ियां समाप्त करने का काम भी बचाएगा। और यह सुनिश्चित करने के लिए कि वे चल रहे हैं, बैच नौकरियों के एक सेट की निगरानी करने के लिए आपको बचाएंगे। –

+0

@ स्पेसमैन: मैं सिग्नलआर के बारे में शोध करना सुनिश्चित करूँगा, एक वास्तविक समय पुस्तकालय जैसे कि यहां अच्छा प्रदर्शन हो सकता है और आप कुछ अच्छी यूएक्स चाल कर सकते हैं। –

+0

@ ब्रायन: मुझे लगता है कि इस निष्कासन के बारे में थोड़ी गलतफहमी है, यह खरीदार के कार्ट के बारे में नहीं है, यह उस उत्पाद के स्टॉक के बारे में है। समाप्ति के बाद आपको उस उत्पाद को रिलीज़ करने की आवश्यकता है ताकि कुछ अन्य व्यक्ति इसे खरीद सकें, जब तक कि आपको उन्हें एक अक्षम खरीद बटन दिखाने की आवश्यकता न हो क्योंकि आइटम अभी भी आरक्षित है। बेशक प्रत्येक अनुरोध के लिए आपको अपने स्टॉक की जांच करने की ज़रूरत है, लेकिन अब आपकी इन्वेंट्री मैनेजर सेवा को आरक्षित आइटम की समाप्ति की जांच करने की आवश्यकता होगी। इसके बजाय मैं चाहता हूं कि उत्पाद संकेत समाप्त हो जाए, इसलिए मैं घटकों के बीच आंतरिक संदेश को कम कर सकता हूं। –

संबंधित मुद्दे