c# - 如何为网络应用成就系统构建基于数据库的规则集?

标签 c# sql-server asp.net-mvc

我正在为 ASP.NET MVC 站点规划一个成就系统。我希望成就“规则”存储在数据库中 - 以便更容易添加新成就和管理现有规则的中心位置。用户将无权更改规则。

当用户执行可能获得成就的操作时,将查询数据库规则,如果有匹配项,则为他们提供成就(存储在查找表中,(userId, achievementId, dateAwarded)。

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

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

最佳答案

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

根据经验,构建基于数据库的规则引擎来响应用户操作是一项非常耗时、容易出错且痛苦的工作。

相反,您可以编写任意数量的单独类,每个类负责了解如何授予一项特定成就。使用基类或接口(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
    }
}

这解决了两个问题:

  1. 它比基于数据库的规则引擎简单几个数量级,但灵活得多。如您所见,单个单元非常小且易于更改而不会影响较大的系统。

  2. 它可以异步运行,因此对于需要一些繁重工作来确定是否应该授予它们的成就,用户的正常事件不会受到成就引擎的影响。

关于c# - 如何为网络应用成就系统构建基于数据库的规则集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3296147/

相关文章:

c# - 将异步循环转换为 LINQ 查询

c# - 以编程方式将文件添加到 Kentico 媒体库

按连续外键​​值分组的 SQL 查询

sql-server - SQL Server 2008 R2 Express 权限 - 无法创建数据库或修改用户

javascript - 在 .NET 应用程序中,是否有可能获得 Web 浏览器看到的 DOM 表示形式?

c# - MVC 3 - 如何在异步 WCF 调用后立即 RedirectToAction

c# - 在列表列表中使用 linq to orderBy

c# - Elasticsearch Analyzer忽略连字符

c# - 将 8 bpp 位图图片转换为 1 bpp?

sql-server - Pentaho 连接问题