我已经考虑过实施徽章(就像堆栈溢出上的徽章一样),并认为没有Windows服务将很困难,但是如果可能的话,我想避免使用。

我提出了实施一些示例的计划:

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

如何在数据库中实现?还是另一种方式会更好?

有帮助吗?

解决方案

实际上,基于团队偶尔丢弃的信息,实际上比您描述的要简单得多。

在数据库中,您只需存储一个集合 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);
    }
}

和具体实施:

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

其他提示

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

您可以使用触发器并检查更新或插入,然后如果满足条件,请添加徽章。这似乎很少。从3、2、1 ...开始触发爆炸。

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

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

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

我喜欢触发器的想法,因为您的程序可以返回,等待SQL Server做事。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top