我已经考虑过实现徽章(就像Stack Overflow上的徽章一样)并且认为没有Windows服务会很困难,但是如果可能的话我想避免这样做。
我想出了一个实施一些例子的计划:
如何在数据库中实现?或者另一种方式会更好吗?
答案 0 :(得分:41)
类似于Stackoverflow的实现实际上比你描述的要简单得多,基于团队每隔一段时间丢弃的信息。
在数据库中,您只需存储一组BadgeID
- UserID
对,以跟踪哪些人具有什么(以及计数或行ID以允许某些徽章的多个奖励)。
在应用程序中,每个徽章类型都有一个工作对象。对象位于缓存中,当缓存过期时,工作人员运行自己的逻辑来确定谁应该获得徽章并进行更新,然后将其重新插入缓存中:
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); }
}
}
答案 1 :(得分:4)
工作。这是关键。按设定的时间间隔运行的进程外作业,以检查您提到的条件。我认为您甚至不需要Windows服务,除非它需要一些外部资源来设置级别。我实际上认为StackOverflow也会使用作业进行计算。
答案 2 :(得分:0)
您可以使用触发器并在更新或插入时检查,然后如果您的条件得到满足,请添加徽章。这会处理它似乎更少。开始触发3,2,1 ...
的触发器答案 3 :(得分:0)
评论必须存储在数据库中吗?那么我认为有两种主要方法可以做到这一点。
1)当用户登录时,您会获得评论的计数。这显然不是理想的方法,因为计数可能需要很长时间
2)当用户发布评论时,您可以进行计数,然后使用使用详细信息存储计数,或者您可以执行在添加评论时执行的触发器。然后,触发器将获取新创建的注释的详细信息,获取用户ID,获取计数并将其存储在某种表中的用户。
我喜欢触发器的想法,因为你的程序可以返回w / out等待sql server来完成它的工作。