代码之家  ›  专栏  ›  技术社区  ›  Chaddeus

如何为web应用实现系统构建基于数据库的规则集?

  •  8
  • Chaddeus  · 技术社区  · 14 年前

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

    目前,我正计划在控制器中的某些操作上设置“触发器”,但执行该操作的代码将在模型中。

    1 回复  |  直到 14 年前
        1
  •  9
  •   Community CDub    8 年前

    你会发现 this answer 很有帮助。

    相反,您可以编写任意数量的单独类,每个类负责知道如何授予一个特定的成就。使用基类或接口为它们提供一个公共约定:

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

    你可以 foreach AchievementAwarder 打电话给我 Award()

    public class 100VisitsAwarder : AchievementAwarder
    {
        public override void Award()
        {
            //get a visit count from the db for all users
            //award achievements
        }
    }
    

    这解决了两个问题:

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

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