42

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

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

  • Audobigrapher:检查个人资料中的所有字段是否都已填写。
  • 评论员:发表评论时检查评论数是否等于 10,如果是,则授予徽章。
  • 好答案:投票时检查投票分数是否为 25 或更高。

这如何在数据库中实现?或者其他方式会更好吗?

4

4 回答 4

41

一个类似于 Stackoverflow 的实现实际上比你描述的要简单得多,基于团队每隔一段时间丢弃的一些信息。

在数据库中,您只需存储一组BadgeID-UserID对以跟踪谁拥有什么(以及计数或 rowID 以允许某些徽章获得多个奖励)。

在应用程序中,每种徽章类型都有一个工作对象。对象在缓存中,当缓存过期时,worker 运行自己的逻辑来确定谁应该获得徽章并进行更新,然后将自己重新插入缓存:

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

和一个具体的实现:

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); }
    }
}
于 2010-07-01T23:52:35.257 回答
4

工作。那是关键。以设定的时间间隔运行以检查您提到的标准的进程外作业。我认为您甚至不需要 Windows 服务,除非它需要一些外部资源来设置级别。我实际上认为 StackOverflow 也使用作业来进行计算。

于 2010-07-01T23:50:48.857 回答
0

您可以使用触发器并检查更新或插入,然后如果满足您的条件添加徽章。那将处理它看起来相当少。在 3、2、1...

于 2010-07-01T23:51:44.003 回答
0

评论必须存储在数据库中吗?那么我认为有两种主要方法可以做到这一点。

1)当用户登录时,您会得到评论的计数。这显然不是理想的方法,因为计数可能需要很多时间

2)当用户发表评论时,您可以进行计数并将计数与使用详细信息一起存储,或者您可以执行在添加评论时执行的触发器。然后触发器将获取新创建的评论的详细信息,获取用户 ID,获取计数并将其与用户存储在某种表格中。

我喜欢触发器的想法,因为您的程序可以返回而无需等待 sql server 执行其操作。

于 2010-07-01T23:52:04.680 回答