如何实施徽章?

我已经给了一些想法来实现徽章(就像堆栈溢出这里的徽章),认为这将是困难的没有Windows服务,但我想避免,如果可能的话。

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

  • Audobiographer:检查configuration文件中的所有字段是否填写完毕。
  • 评论人:发表评论时请检查评论数是否等于10,如果是这样的话,给予奖章。
  • 答案:投票的时候检查一下表决得分是25还是更高。

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

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

在数据库中,您只需存储一个BadgeIDUserID对的集合来跟踪谁拥有什么(以及一个计数或一个rowID以允许对某些徽章进行多次奖励)。

在应用程序中,每个徽章types都有一个工人对象。 该对象位于caching中,当caching过期时,该工作者运行自己的逻辑以确定谁应该获得徽章并进行更新,然后将其自身重新插入到caching中:

 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也使用作业进行计算。

您可以使用触发器并检查更新或插入,然后如果您的条件符合添加徽章。 这将处理它似乎更less。 开始抨击3,2,1 …

注释必须存储在数据库中吗? 那么我认为有两个主要的方法来做到这一点。

1)当用户login时,你会得到评论的数量。 这显然不是期望的方法,因为伯爵可能需要很长时间

2)当用户发表评论,你可以做一个计数然后存储计数与使用细节,或者你可以做一个触发器,当添加评论时执行。 触发器会获得新创build的注释的详细信息,获取用户ID,获取计数并将其存储在某个表的某个表中。

我喜欢触发器的想法,因为你的程序可以返回等待SQL服务器做它的东西。