سؤال

لقد فكرت في تنفيذ شارات (تمامًا مثل الشارات هنا على Stack Overflow) وأعتقد أنه سيكون من الصعب بدون خدمات Windows ، لكنني أود تجنب ذلك إن أمكن.

توصلت إلى خطة لتنفيذ بعض الأمثلة:

  • Audobiographer: تحقق مما إذا تم ملء جميع الحقول في الملف الشخصي.
  • المعلق: عند إجراء تعليق ، تحقق مما إذا كان عدد التعليقات يساوي 10 ، إذا كان الأمر كذلك ، فمنح الشارة.
  • إجابة جيدة: عند التصويت ، تحقق لمعرفة ما إذا كانت درجة التصويت هي 25 أو أعلى.

كيف يمكن تنفيذ هذا في قاعدة البيانات؟ أم أن بطريقة أخرى ستكون أفضل؟

هل كانت مفيدة؟

المحلول

إن تطبيق مماثل للتشكيل هو في الواقع أبسط بكثير مما وصفته ، استنادًا إلى أجزاء من المعلومات التي أسقطها الفريق مرة واحدة في لحظة.

في قاعدة البيانات ، يمكنك ببساطة تخزين مجموعة من 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); }
    }
}

نصائح أخرى

وظائف. هذا هو المفتاح. وظائف خارج العملية التي تعمل على فترات محددة للتحقق من المعايير التي ذكرتها. لا أعتقد أنك بحاجة إلى خدمة Windows ما لم تتطلب بعض الموارد الخارجية لتعيين المستويات. أعتقد في الواقع Stackoverflow الوظائف أيضًا لحساباتها.

يمكنك استخدام المشغلات والتحقق من التحديث أو الإدراج ، ثم إذا تم استيفاء ظروفك ، أضف شارة. من شأنه أن يتعامل معها تبدو أقل. بدء تشغيل الزناد في 3 ، 2 ، 1 ...

يجب تخزين التعليقات داخل قاعدة البيانات أليس كذلك؟ ثم أعتقد أن هناك طريقتان رئيسيتان للقيام بذلك.

1) عندما يقوم المستخدم بتسجيل الدخول ، تحصل على عدد من التعليقات. هذا ليس هو النهج المرغوب فيه لأن العد قد يستغرق الكثير من الوقت

2) عندما ينشر المستخدم تعليقًا ، يمكنك إما إجراء عدد ثم تخزين العد مع تفاصيل الاستخدام أو يمكنك القيام بمشغل ينفذ عند إضافة تعليق. سيحصل المشغل بعد ذلك على تفاصيل التعليق الذي تم إنشاؤه حديثًا ، والاستيلاء على معرف المستخدم ، والحصول على عدد وتخزينه ضد المستخدم في جدول من نوع ما.

يعجبني فكرة الزناد حيث يمكن أن يعود البرنامج مع انتظار SQL Server للقيام بأشياءه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top