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

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

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

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

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

42
задан Luke101 3 July 2010 в 13:52
поделиться

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); }
    }
}
41
ответ дан 26 November 2019 в 23:58
поделиться

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

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

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

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

0
ответ дан 26 November 2019 в 23:58
поделиться

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

0
ответ дан 26 November 2019 в 23:58
поделиться

Вакансии. Это ключ. Внепроцессные задания, которые выполняются с заданными интервалами, чтобы проверить указанные вами критерии. Я не думаю, что вам даже нужна служба Windows, если только она не требует каких-либо внешних ресурсов для установки уровней. Я действительно думаю, что StackOverflow также использует задания для своих вычислений.

4
ответ дан 26 November 2019 в 23:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: