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

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

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

  • Audobiographer: Проверьте, заполнены ли все поля в профиле.
  • Commentor: при создании комментария проверьте, если количество комментариев равно 10, если так наградить значок.
  • хорошее Ответ: при голосовании проверьте, если оценка голосования 25 или выше.

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

4 ответов


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

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


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


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

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

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

Мне нравится идея триггера, так как ваша программа может вернуться без ожидания sql server, чтобы сделать свое дело.