如何实施徽章?

Luk*_*101 42 c# sql-server-2005 badge asp.net-mvc-2

我已经考虑过实现徽章(就像Stack Overflow上的徽章一样)并且认为没有Windows服务会很困难,但我想尽可能避免这种情况.

我想出了一个实施一些例子的计划:

  • Audobiographer:检查配置文件中的所有字段是否已填写.
  • 评论员:在发表评论时检查评论数量是否等于10,如果是,则授予徽章.
  • 好答案:投票时检查投票得分是否为25或更高.

怎么能在数据库中实现呢?或者另一种方式会更好吗?

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)