Вопрос

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

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

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

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

Это было полезно?

Решение

Аналогичная реализация-To-Stackoverflow на самом деле намного проще, чем вы описали, на основе битов информации, упадут командой каждый раз в некоторое время некоторое время.

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

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

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) Когда пользователь отправляет комментарий, вы можете либо сделать счет, и хранить количество с деталями использования, или вы можете сделать триггер, который выполняет, когда добавлен комментарий. Затем триггер получит детали вновь созданного комментариев, захватите идентификатор пользователя, получить счет и хранить это против пользователя в таблице своего рода.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top