Un'implementazione simile a StackOverflow è in realtà molto più semplice di quella che hai descritto, in base a frammenti di informazioni rilasciati dal team di tanto in tanto.
Nel database, è sufficiente memorizzare una collezione di coppie BadgeID
- UserID
per individuare chi ha cosa (e un conteggio o un rowID per consentire più riconoscimenti per alcuni badge).
Nell'applicazione, c'è un oggetto di lavoro per ogni tipo di badge. 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 si ri-inserti 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 un implementazione concreta:
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); }
}
}
fonte
2010-07-01 23:52:35
Si desidera memorizzare in cache alcuni valori di reputazione sul server Web senza dover chiamare costantemente i servizi di Windows. – Russell