Frage

habe ich einige Gedanken zur Umsetzung Abzeichen gegeben (wie die Abzeichen hier auf Stack-Überlauf) und denke, es ist ohne Windows-Dienste schwierig sein würde, aber ich möchte vermeiden, dass, wenn möglich.

kam ich mit einem Plan um einige Beispiele zu implementieren:

  • Audobiographer. Überprüfen Sie, ob alle Felder im Profil ausgefüllt
  • Commentor. Wenn ein Kommentar Prüfung zu machen, wenn die Anzahl der Kommentare 10 gleich, wenn so preis das Abzeichen
  • Gute Antwort. Wenn Prüfung abstimmen zu sehen, ob Stimme Punktzahl 25 oder höher

Wie könnte dies in der Datenbank umgesetzt werden? Oder wäre besser einen anderen Weg geben?

War es hilfreich?

Lösung

Ein ähnliches zu Stackoverflow-Implementierung ist eigentlich viel einfacher, als Sie beschrieben haben, basierend auf Bits von Informationen, die das Team fiel jeder einmal in eine Weile.

In der Datenbank speichern Sie einfach eine Sammlung von BadgeID-UserID Paaren zu verfolgen, wer was hat (und eine Zählung oder ein rowID für einige Abzeichen mehr Auszeichnungen zu ermöglichen).

In der Anwendung gibt es ein Arbeiter-Objekt für jeden Abzeichen Typen. Das Objekt befindet sich im Cache, und wenn der Cache abläuft, der Arbeiter betreibt eine eigene Logik zur Bestimmung, wer das Abzeichen erhalten sollten und die Updates zu machen und es dann wieder fügt sich in den Cache:

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

Und eine konkrete Umsetzung:

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

Andere Tipps

Jobs. Das ist der Schlüssel. Aus Prozess Jobs, die laufen in festgelegten Intervallen, die Kriterien zu überprüfen, ob Sie erwähnen. Ich glaube nicht, dass Sie auch einen Windows-Dienst haben müssen, es sei denn es einige externe Ressourcen erfordert die Pegel einzustellen. Ich eigentlich denke, Stackoverflow verwendet Arbeitsplätze als auch für ihre Berechnungen.

Sie könnten Trigger verwenden und überprüfen Sie auf aktualisieren oder einfügen, dann, wenn Ihre Bedingungen Add Abzeichen erfüllt sind. Dass es handhaben wäre ziemlich scheinen weniger. Beginnen Sie den Auslöser bashing in 3, 2, 1 ...

Kommentare müssen in der Datenbank direkt gespeichert werden? dann denke ich, gibt es zwei Möglichkeiten, dies zu tun.

1), wenn sich ein Benutzer anmeldet Sie eine Zählung der Kommentare. dies ist obvisously nicht der gewünschte Ansatz als die Zählung eine Menge Zeit in Anspruch nehmen könnte

2), wenn ein Benutzer entsendet einen Kommentar, den Sie entweder eine Zählung tun konnte, dann und speichern Sie die Zählung mit der Verwendung Details oder Sie können einen Trigger tun, die ausgeführt wird, wenn ein Kommentar hinzugefügt wird. der Auslöser bekommen würde dann die Details des neu erstellten Kommentars, das Benutzer-ID greifen, eine Zählung und zu speichern, dass gegen den Benutzer in einer Tabelle von einer Art erhalten.

Ich mag die Idee eines Abzugs als Ihr Programm w / out warten auf SQL Server zurückgeben kann seine Sachen zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top