我正在为ASP.NET MVC网站计划成就系统。我希望将成就“规则”存储在数据库中-以便更轻松地添加新成就以及在中心位置管理现有规则。用户将无权更改规则。

当用户执行可能会获得成就的 Action 时,将查询db规则,如果匹配,则向他们提供成就(存储在查找表中(userId,achievementId,dateAwarded)。

目前,我正计划在 Controller 中的某些 Action 上使用“触发器”,但是完成工作的代码将在模型中。

成就系统是否有实现此目标的标准DB模式?不必要的话,无需重新发明轮子。如果没有,您认为会出现什么样的问题,需要注意什么?

最佳答案

您可能会发现 this answer 很有帮助。

从经验上来讲,构建基于数据库的规则引擎以对用户操作使用react是一项非常耗时,容易出错且痛苦的练习。

相反,您可以编写任意数量的个人类(class),每个类(class)负责了解如何授予一项特定成就。使用基类或接口(interface)为它们提供所有通用协定:

public abstract class AchievementAwarder
{
    //override to provide specific badge logic
    public abstract void Award();
}

您可以对每个foreach进行AchievementAwarder编码,然后按周期性时间表调用Award()。例如,您可能获得“100次访问”成就:
public class 100VisitsAwarder : AchievementAwarder
{
    public override void Award()
    {
        //get a visit count from the db for all users
        //award achievements
    }
}

这解决了两个问题:
  • 与基于数据库的规则引擎相比,它的数量级更简单,但更灵活。如您所见,单个单元非常小,易于更改,而不会影响较大的系统。
  • 它可以异步运行,因此对于需要费力才能确定是否应授予的成就,成就引擎不会影响用户的正常事件。
  • 关于c# - 如何为Web应用程序成就系统构建基于数据库的规则集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3296147/

    10-12 22:04