2010-07-21 4 views
8

मैं एएसपी.नेट एमवीसी साइट के लिए एक उपलब्धि प्रणाली की योजना बना रहा हूं। मैं चाहता हूं कि उपलब्धियां "नियम" डेटाबेस में संग्रहीत हों - मौजूदा उपलब्धियों को प्रबंधित करने के लिए नई उपलब्धियों और केंद्रीय स्थान को जोड़ना आसान हो। उपयोगकर्ताओं को नियमों को बदलने के लिए कोई पहुंच नहीं होगी।वेब ऐप उपलब्धि प्रणाली के लिए डीबी आधारित नियम कैसे बनाएं?

एक उपयोगकर्ता कोई ऐसा कार्य है कि संभावित उपलब्धि अर्जित कर सकता है करता है, db नियम पूछे की जाएगी और अगर मिलान पाए जाने पर, उन्हें उपलब्धियों (एक लुकअप तालिका, (userId, achievementId, dateAwarded) में संग्रहीत दे।

फिलहाल मैं नियंत्रक में कुछ कार्रवाई पर "ट्रिगर" डाल करने की योजना बना रही है, लेकिन कोड है कि काम करता है मॉडल में होगा।

वहाँ एक उपलब्धि प्रणाली है कि पूरा करता है के लिए मानक डीबी स्कीमा है यदि आवश्यक नहीं है तो पहिया को फिर से शुरू करने की कोई ज़रूरत नहीं है। यदि नहीं, तो आपको किस तरह के मुद्दों को लगता है कि पॉप अप होगा,

उत्तर

9

आपको this answer सहायक मिल सकता है।

अनुभव से बात करते हुए, उपयोगकर्ता क्रियाओं पर प्रतिक्रिया करने के लिए डेटाबेस-आधारित नियम इंजन का निर्माण करना बहुत समय लेने वाला, त्रुटि-प्रवण, दर्दनाक व्यायाम है।

इसके बजाय, आप किसी भी विशिष्ट कक्षा को लिखने के लिए जिम्मेदार प्रत्येक व्यक्ति को अलग-अलग कक्षाएं लिख सकते हैं। प्रत्येक AchievementAwarder से अधिक

public abstract class AchievementAwarder 
{ 
    //override to provide specific badge logic 
    public abstract void Award(); 
} 

आप foreach कर सकते हैं और नियमित शेड्यूल पर Award() फोन: उन सब को एक आम अनुबंध देने के लिए एक आधार वर्ग या इंटरफ़ेस का उपयोग करें। उदाहरण के लिए, यदि आप एक "100" को उपलब्धि हो सकता है:

public class 100VisitsAwarder : AchievementAwarder 
{ 
    public override void Award() 
    { 
     //get a visit count from the db for all users 
     //award achievements 
    } 
} 

यह दो समस्याओं को हल करती है:

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

  2. यह असीमित रूप से चलाया जा सकता है, इसलिए ऐसी उपलब्धियों के लिए जिन्हें कुछ भारी उठाने की आवश्यकता होती है, यह निर्धारित करने के लिए कि उन्हें सम्मानित किया जाना चाहिए, उपयोगकर्ता की सामान्य गतिविधियां उपलब्धि इंजन द्वारा प्रभावित नहीं होती हैं।

+0

@Rex M - यह बहुत अच्छा लगता है! उदाहरण के लिए आपने यह दिया है कि यह एक क्रॉन जॉब प्रकार का लुकअप होगा। आप उपयोगकर्ताओं द्वारा किए गए कार्यों में हुकिंग की अनुशंसा कैसे करेंगे? उदाहरण के लिए, वे नई "चीज़" पोस्ट करते हैं और यह 100 वां है, इसलिए उन्हें एक उपलब्धि दें। यह भी मान लें कि एक नई "चीज़" पोस्ट करने के लिए उपलब्धियों की कोई संख्या हो सकती है। – Chaddeus

+2

@ चाड देर से उत्तर के लिए खेद है - अपने प्रश्न का उत्तर देने के लिए, जैसा कि आपने कहा है कि यह एक क्रॉन नौकरी के रूप में सबसे अच्छा काम करता है या, दूसरे जवाब में, मैंने ऐप स्टार्टअप में एक स्व-डालने वाली कैश ऑब्जेक्ट शुरू की है। सादगी और प्रदर्शन के लिए, आपके आस-पास की सबसे अच्छी शर्त, जहां भी संभव हो वहां सीधे उपयोगकर्ता क्रियाओं को जोड़ने से बचें। कई मामलों में आपको किनारे पर धकेलने वाली कार्रवाई और पुरस्कार दिए जाने के बीच कुछ मिनटों के विलंब के साथ जीना बेहतर होता है। –

+0

@ रेक्स एम - धन्यवाद ... फोरस्क्वेयर इसे कैसे करता है? मैं इसका उपयोग नहीं करता, लेकिन जब कोई उपयोगकर्ता बैज को अनलॉक करता है, तो क्या वे तुरंत इसे प्राप्त करते हैं? या बाद में यह सम्मानित किया जाता है जब क्रॉन नौकरी घूमती है? मुझे निश्चित रूप से साइट कलाकार को रखने का विचार पसंद है! होम पेज को लोड करने के लिए बस .48 सेकंड में लोड किया गया।: डी – Chaddeus

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