Domanda

ho dato qualche pensiero per badge attuazione (proprio come i cartellini qui su Stack Overflow) e pensare che sarebbe stato difficile senza i servizi di Windows, ma vorrei evitare che, se possibile.

mi si avvicinò con un piano per implementare alcuni esempi:

  • Audobiographer:. Verificare che tutti i campi di profilo è compilati
  • Commentor:. Quando si effettua un commento controllo se il numero di commenti pari al 10, in tal caso il premio distintivo
  • Buona Risposta:. Quando si vota fino controllo per vedere se il punteggio voto è di 25 o superiore

Come potrebbe essere implementato nel database? O sarebbe un altro modo essere meglio?

È stato utile?

Soluzione

Un'implementazione simile a StackOverflow è in realtà molto più semplice di quello che hai descritto, sulla base di bit di informazioni è sceso dal team una volta ogni tanto.

Nel database, è sufficiente memorizzare un insieme di coppie BadgeID-UserID tenere traccia di chi ha che cosa (e un conteggio o un rowID per consentire a più premi per alcuni badge).

Nella domanda, c'è un oggetto lavoratore per ogni tipo di distintivo. L'oggetto si trova nella cache, e quando la cache scade, il lavoratore gestisce una sua logica per determinare chi dovrebbe ottenere il distintivo e facendo gli aggiornamenti, e poi re-inserisce se stesso nella 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);
    }
}

E una concreta attuazione:

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

Altri suggerimenti

Lavoro. Questa è la chiave. Fuori di elaborare i lavori che vengono eseguiti a intervalli prestabiliti per verificare i criteri che hai citato. Non credo che si è nemmeno necessario avere un servizio di Windows a meno che non richiede alcune risorse esterne per impostare i livelli. Io in realtà penso StackOverflow utilizza posti di lavoro anche per i loro calcoli.

Si potrebbe utilizzare i trigger e visualizzate su di aggiornamento o di inserimento, quindi se le vostre condizioni sono soddisfatte distintivo aggiuntivo. Che sarebbe gestire abbastanza sembrare meno. Iniziare il pestaggio grilletto a 3, 2, 1 ...

commenti devono essere memorizzati all'interno del proprio database? quindi penso che ci sono due modi principali per farlo.

1) quando un utente accede in si ottiene un conteggio dei commenti. questo non è obvisously l'approccio desiderato come il conteggio potrebbe prendere un sacco di tempo

2) quando un utente inserisce un commento si potrebbe o fare un conteggio allora e memorizzare il conteggio con i dettagli di utilizzo o si potrebbe fare un trigger che viene eseguito quando viene aggiunto un commento. il grilletto sarebbe quindi ottenere i dettagli del commento appena creato, afferrare l'ID utente, ottenere un conteggio e negozio che contro l'utente in una tabella di qualche tipo.

Mi piace l'idea di un trigger come il programma può tornare w / out in attesa di SQL Server per fare la sua roba.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top