Luk*_*101 42 c# sql-server-2005 badge asp.net-mvc-2
我已经考虑过实现徽章(就像Stack Overflow上的徽章一样)并且认为没有Windows服务会很困难,但我想尽可能避免这种情况.
我想出了一个实施一些例子的计划:
怎么能在数据库中实现呢?或者另一种方式会更好吗?
Rex*_*x M 41
类似于Stackoverflow实现实际上比您描述的要简单得多,基于团队每隔一段时间丢弃的信息.
在数据库中,您只需存储一对BadgeID- UserID对来跟踪谁拥有什么(和一个计数或一个rowID,以允许一些徽章的多个奖励).
在应用程序中,每个徽章类型都有一个工作对象.对象位于缓存中,当缓存过期时,工作人员运行自己的逻辑来确定谁应该获得徽章并进行更新,然后将其重新插入缓存中:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
并具体实施:
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); }
}
}
Run Code Online (Sandbox Code Playgroud)