Question

J'ai réfléchi à la mise en œuvre des badges (comme les badges ici sur Stack Overflow) et pense qu'il serait difficile sans les services Windows, mais je voudrais éviter que, si possible.

Je suis venu avec un plan pour mettre en œuvre quelques exemples:

  • Audobiographer:. Vérifiez si tous les champs du profil est rempli
  • Commentor. Lors d'un contrôle de commentaire si le nombre de commentaires égal 10, si ce prix le badge
  • Bonne réponse:. Lors du vote en vérification pour voir si le score de vote est 25 ou plus

Comment cela pourrait-il être mis en œuvre dans la base de données? Ou serait une autre façon de mieux?

Était-ce utile?

La solution

Une mise en œuvre similaire à Stackoverflow est en fait beaucoup plus simple que vous avez décrit, sur la base peu d'information a chuté par l'équipe de temps en temps.

Dans la base de données, vous stockez simplement une collection de paires BadgeID-UserID pour suivre qui a quoi (et un compte ou un rowID pour permettre de multiples récompenses pour certains badges).

Dans l'application, il y a un objet de travail pour chaque type de badge. L'objet est dans le cache, et lorsque le cache expire, le travailleur exécute sa propre logique pour déterminer qui doit obtenir le badge et faire les mises à jour, puis il se réinsère dans le 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);
    }
}

Et une mise en œuvre concrète:

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

Autres conseils

Offres d'emploi. C'est la clé. Sur des emplois de processus qui fonctionnent à des intervalles fixés pour vérifier les critères que vous mentionnez. Je ne pense pas que vous avez besoin même d'avoir un service Windows à moins qu'il nécessite des ressources externes pour définir les niveaux. Je pense en fait StackOverflow utilise des emplois aussi bien pour leurs calculs.

Vous pouvez utiliser les déclencheurs et vérifier sur la mise à jour ou insérer, alors si vos conditions sont remplies badge add. Cela semble gérer assez moins. Commencer le dénigrement de déclenchement à 3, 2, 1 ...

les commentaires doivent être stockés dans la base de données de droit? alors je pense qu'il ya deux façons de le faire.

1) lorsqu'un utilisateur se connecte à un compte vous obtenez des commentaires. c'est obvisously pas l'approche souhaitée que le nombre pourrait prendre beaucoup de temps

2) lorsqu'un message utilisateur un commentaire vous pouvez soit faire un compte alors et stocker le nombre avec les détails d'utilisation ou vous pouvez faire un déclencheur qui exécute lorsqu'un commentaire est ajouté. la gâchette alors obtenir les détails du nouveau commentaire, saisissez l'ID utilisateur, obtenir un compte et stocker que contre l'utilisateur dans une table de quelque sorte.

i comme l'idée d'un déclencheur que votre programme peut retourner w / out en attente pour le serveur SQL pour faire son truc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top