Как реализовать значки?

Я немного подумал о реализации значков (так же, как значки здесь в Stack Overflow) и думаю, что это будет сложно без служб Windows, но я бы хотел избежать этого, если это возможно.

Я придумал план для реализации некоторых примеров:

  • Audobiographer: Проверьте, все ли поля в профиле заполнены.
  • Комментатор: при создании комментария проверяйте, равняется ли количество комментариев 10, если это так, присуждайте значок.
  • Хороший ответ: при голосовании проверьте, является ли счет для голосования 25 или выше.

Как это можно реализовать в базе данных? Или другой способ будет лучше?

4 ответа

Решение

Реализация, похожая на Stackru, на самом деле намного проще, чем вы описали, основываясь на битах информации, отбрасываемой командой каждый раз в какое-то время.

В базе данных вы просто храните коллекцию BadgeID-UserID пары, чтобы отслеживать, кто что имеет (и количество или rowID, чтобы разрешить несколько наград за некоторые значки).

В приложении есть рабочий объект для каждого типа значка. Объект находится в кеше, и когда срок его действия истекает, рабочий запускает собственную логику для определения, кто должен получить значок и делать обновления, а затем снова вставляет себя в кеш:

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, если для установки уровней не требуются внешние ресурсы. Я действительно думаю, что Stackru также использует задания для своих расчетов.

Комментарии должны храниться в базе данных, верно? тогда я думаю, что есть два основных способа сделать это.

1) когда пользователь входит в систему, вы получаете количество комментариев. это явно не желательный подход, так как подсчет может занять много времени

2) когда пользователь публикует комментарий, вы можете либо выполнить подсчет, а затем сохранить счет с подробными данными об использовании, или вы можете сделать триггер, который выполняется при добавлении комментария. затем триггер получит сведения о вновь созданном комментарии, получит идентификатор пользователя, получит счетчик и сохранит его для пользователя в некоторой таблице.

Мне нравится идея триггера, поскольку ваша программа может возвращаться без ожидания, пока SQL Server не выполнит свою работу.

Вы можете использовать триггеры и проверять после обновления или вставки, а затем, если ваши условия выполнены, добавить значок. Это справится, кажется, меньше. Начните активировать триггер через 3, 2, 1...

Другие вопросы по тегам