Une implémentation similaire à Stackoverflow est en réalité beaucoup plus simple que ce que vous avez décrit, sur la base de bits d'information déposés 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 nombre ou un rowID pour autoriser plusieurs récompenses pour certains badges).
Dans l'application, il existe 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 réinsère se 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 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); }
}
}
Vous voudriez mettre en cache une certaine utilisation de la valeur de réputation sur le serveur Web sans avoir à appeler constamment les services Windows. – Russell