2010-07-01 29 views
42

मैंने बैज को लागू करने के लिए कुछ विचार दिया है (बस स्टैक ओवरफ़्लो पर बैज की तरह) और लगता है कि विंडोज सेवाओं के बिना यह मुश्किल होगा, लेकिन यदि संभव हो तो मैं इससे बचना चाहूंगा।बैज को कैसे कार्यान्वित करें?

मैं कुछ उदाहरण लागू करने के लिए एक योजना के साथ आया था:

  • Audobiographer: यदि प्रोफ़ाइल में सभी फील्ड को भर जाता है की जाँच करें।
  • टिप्पणीकर्ता: टिप्पणी करते समय जांच करें कि टिप्पणियों की संख्या 10 बराबर है, यदि ऐसा है तो बैज को पुरस्कृत करें।
  • अच्छा उत्तर: यह देखने के लिए मतदान करना कि वोट स्कोर 25 या उच्चतर है या नहीं।

यह डेटाबेस में कैसे कार्यान्वित किया जा सकता है? या एक और तरीका बेहतर होगा?

+0

आप लगातार विंडोज़ सेवाओं को कॉल किए बिना वेब सर्वर पर कुछ उपयोग प्रतिष्ठा मूल्य कैश करना चाहते हैं। – Russell

उत्तर

41

एक समान-से-स्टैक ओवरफ्लो कार्यान्वयन वास्तव में कुछ समय में टीम द्वारा छोड़ी गई जानकारी के बिट्स के आधार पर वर्णित आपके मुकाबले बहुत आसान है।

डेटाबेस में, आप बस BadgeID - UserID जोड़े का संग्रह संग्रहीत करने के लिए एकत्र करते हैं कि कौन है (और एक गिनती या एक पंक्ति आईडी कुछ बैज के लिए एकाधिक पुरस्कारों की अनुमति देता है)।

एप्लिकेशन में, प्रत्येक बैज प्रकार के लिए एक कार्यकर्ता वस्तु होती है। वस्तु कैश में है, और जब कैश समाप्त हो रहा है, कार्यकर्ता का निर्धारण जो बिल्ला मिलना चाहिए और बनाने अपडेट के लिए अपने स्वयं के तर्क से चलाता है, और फिर इसे कैश में फिर से आवेषण ही:

public abstract class BadgeJob 
{ 
    protected BadgeJob() 
    { 
     //start cycling on initialization 
     Insert(); 
    } 

    //override to provide specific badge logic 
    protected abstract void AwardBadges(); 

    //how long to wait between iterations 
    protected abstract TimeSpan Interval { get; } 

    private void Callback(string key, object value, CacheItemRemovedReason reason) 
    { 
     if (reason == CacheItemRemovedReason.Expired) 
     { 
      this.AwardBadges(); 
      this.Insert(); 
     } 
    } 

    private void Insert() 
    { 
     HttpRuntime.Cache.Add(this.GetType().ToString(), 
      this, 
      null, 
      Cache.NoAbsoluteExpiration, 
      this.Interval, 
      CacheItemPriority.Normal, 
      this.Callback); 
    } 
} 

और एक ठोस कार्यान्वयन:

public class CommenterBadge : BadgeJob 
{ 
    public CommenterBadge() : base() { } 

    protected override void AwardBadges() 
    { 
     //select all users who have more than x comments 
     //and dont have the commenter badge 
     //add badges 
    } 

    //run every 10 minutes 
    protected override TimeSpan Interval 
    { 
     get { return new TimeSpan(0,10,0); } 
    } 
} 
+0

वाह। यह एक अच्छा विचार है। कैश की समयसीमा समाप्त होने पर आप कैसे जानते हैं। क्या कॉल बैक फ़ंक्शन की तरह है जब आप कैश की समयसीमा समाप्त कर सकते हैं? – Luke101

+0

@ Luke101 कोड नमूना –

+1

@ ल्यूक 101 देखें: यह .NET कैशिंग इंफ्रास्ट्रक्चर की एक विशेषता है: जब टाइमआउट समाप्त हो जाता है (और ऑब्जेक्ट कैश से निकाला जा रहा है) रनटाइम स्वचालित रूप से आपके कॉलबैक को कॉल करता है। –

4

नौकरियां। वह कुंजी है। आपके द्वारा उल्लिखित मानदंडों की जांच करने के लिए सेट अंतराल पर चलने वाली प्रक्रिया नौकरियों में से। मुझे नहीं लगता कि आपको विंडोज़ सर्विस की भी आवश्यकता है जब तक कि इसे स्तर निर्धारित करने के लिए कुछ बाहरी संसाधनों की आवश्यकता न हो। मुझे लगता है कि स्टैक ओवरफ्लो उनकी गणना के लिए नौकरियों का भी उपयोग करता है।

+2

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

+0

नौकरियां स्वचालित रूप से चलती हैं? मुझे नौकरियों पर और जानकारी कहां मिल सकती है? – Luke101

+0

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

0

आप ट्रिगर्स का उपयोग कर सकते हैं और अपडेट या डालने पर जांच सकते हैं, फिर यदि आपकी शर्तों को पूरा किया जाता है तो बैज जोड़ें। यह इसे बहुत कम लग रहा है संभाल लेंगे। 3, 2, 1 में ट्रिगर bashing शुरू करें ...

+6

यह बिल्कुल सही (वैध) कारण ट्रिगर्स हैं। –

+0

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

+0

प्रदर्शन और वैधता मुद्दे ट्रिगर से उत्पन्न होते हैं क्योंकि वे अपेक्षाकृत बोलते हैं, प्रबंधन के लिए बहुत मुश्किल हैं। वे दुष्प्रभाव-उन्मुख होते हैं, जबकि आम तौर पर यह आमतौर पर स्वीकार किया जाता है कि साइड इफेक्ट्स वाला कोड आपदा के लिए एक नुस्खा है। कॉलर के परिप्रेक्ष्य से - एक ही ऑपरेशन (उदा। डालने) के लिए एक मजबूत केस बनाना मुश्किल है - कॉलर के परिप्रेक्ष्य से - प्रणाली के लिए अतिरिक्त दुष्प्रभावों की अज्ञात राशि। –

0

टिप्पणियां डेटाबेस के भीतर सही ढंग से संग्रहीत की जानी चाहिए? तो मुझे लगता है कि ऐसा करने के दो मुख्य तरीके हैं।

1) जब कोई उपयोगकर्ता आपको लॉग इन करता है तो टिप्पणियों की गिनती प्राप्त होती है। यह मोटे तौर पर वांछित दृष्टिकोण नहीं है क्योंकि गिनती में बहुत समय लग सकता है

2) जब कोई उपयोगकर्ता कोई टिप्पणी पोस्ट करता है तो आप या तो गिनती कर सकते हैं और उपयोग विवरण के साथ गिनती स्टोर कर सकते हैं या आप एक ट्रिगर कर सकते हैं जब कोई टिप्पणी जोड़ दी जाती है तो निष्पादित होता है। ट्रिगर को तब नव निर्मित टिप्पणी का ब्योरा मिलेगा, उपयोगकर्ता आईडी को पकड़ लें, गिनती करें और किसी प्रकार की तालिका में उपयोगकर्ता के खिलाफ स्टोर करें।

मुझे ट्रिगर का विचार पसंद है क्योंकि आपका प्रोग्राम एसक्यूएल सर्वर के लिए अपनी सामग्री करने के लिए प्रतीक्षा कर रहा है।

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