Jak zaimplementować odznaki?

Myślałem o zaimplementowaniu odznak (tak jak ODZNAKI tutaj na Stack Overflow) i myślę, że byłoby to trudne bez usług Windows, ale chciałbym tego uniknąć, jeśli to możliwe.

Wymyśliłem plan wdrożenia kilku przykładów:

  • Audobiographer: sprawdź, czy wszystkie pola w profilu są wypełnione.
  • Commentor: dokonując komentarza sprawdź, czy liczba komentarzy jest równa 10, jeśli tak, przyznaj odznakę.
  • dobra odpowiedź: podczas głosowania sprawdzaj do sprawdź, czy wynik głosowania jest 25 lub wyższy.

Jak można to zaimplementować w bazie danych? A może inny sposób byłby lepszy?

Author: Luke101, 2010-07-02

4 answers

Implementacja podobna do Stackoverflow jest w rzeczywistości o wiele prostsza niż opisałeś, oparta na fragmentach informacji upuszczanych przez zespół co jakiś czas.

W bazie danych po prostu przechowujesz kolekcję BadgeID-UserID pary, aby śledzić, kto ma co (i licznik lub rowID, aby umożliwić wiele nagród dla niektórych odznak).

W aplikacji znajduje się obiekt worker dla każdego typu znaczka. Obiekt znajduje się w pamięci podręcznej, a gdy pamięć podręczna wygaśnie, worker uruchamia własną logikę dla określenie, kto powinien dostać odznakę i dokonanie aktualizacji, a następnie ponownie wstawia się do pamięci podręcznej:

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);
    }
}

I konkretna realizacja:

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
Author: Rex M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-19 15:38:54

Praca. To jest klucz. Out of process jobs that run at set interrupts to check the criteria that you mention. Nie sądzę, że nawet trzeba mieć usługę windows, chyba że wymaga to zewnętrznych zasobów, aby ustawić poziomy. Myślę, że StackOverflow również wykorzystuje zadania do swoich obliczeń.

 4
Author: spinon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-01 23:50:48

Możesz użyć wyzwalaczy i sprawdzić po aktualizacji lub wstawieniu, a jeśli twoje warunki są spełnione dodaj znaczek. To by sobie z tym poradziło. Rozpocząć uderzenie za 3, 2, 1...

 0
Author: Dustin Laine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-01 23:51:44

Komentarze muszą być przechowywane w bazie danych prawda? myślę, że są dwa główne sposoby, aby to zrobić.

1) po zalogowaniu się użytkownik otrzymuje ilość komentarzy. nie jest to oczywiście pożądane podejście, ponieważ liczenie może zająć dużo czasu

2) gdy użytkownik publikuje komentarz możesz albo zrobić licznik i zapisać licznik ze szczegółami użycia, albo możesz wykonać wyzwalacz, który wykonuje się po dodaniu komentarza. WYZWALACZ dostałby wtedy szczegóły nowo utworzony komentarz, chwyć identyfikator użytkownika, uzyskaj liczbę i przechowuj go przed Użytkownikiem w jakiejś tabeli.

Podoba mi się pomysł wyzwalacza, ponieważ twój program może powrócić w/out czekając na SQL server, Aby Zrobić swoje rzeczy.

 0
Author: griegs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-01 23:52:04